Merge branch 'main' into vue3

# Conflicts:
#	src/components/input/editor.vue
#	src/components/list/partials/filters.vue
#	src/components/tasks/partials/editAssignees.vue
#	src/helpers/find.ts
#	src/helpers/time/formatDate.js
#	src/main.ts
#	src/store/modules/attachments.js
#	src/store/modules/kanban.js
#	src/views/list/views/List.vue
#	yarn.lock
This commit is contained in:
Dominik Pschenitschni 2021-10-07 12:20:52 +02:00
commit 3a7a4bdc42
No known key found for this signature in database
GPG key ID: B257AC0149F43A77
120 changed files with 717 additions and 272 deletions

View file

@ -353,7 +353,7 @@ describe('Task', () => {
.first() .first()
.click() .click()
cy.get('.global-notification') cy.get('.global-notification', { timeout: 4000 })
.should('contain', 'Success') .should('contain', 'Success')
cy.get('.task-view .details.labels-list .multiselect .input-wrapper span.tag') cy.get('.task-view .details.labels-list .multiselect .input-wrapper span.tag')
.should('exist') .should('exist')

View file

@ -1,5 +1,4 @@
import {seed} from './seed' import {seed} from './seed'
import merge from 'lodash/merge'
/** /**
* A factory makes it easy to seed the database with data. * A factory makes it easy to seed the database with data.
@ -25,7 +24,10 @@ export class Factory {
const data = [] const data = []
for (let i = 1; i <= count; i++) { for (let i = 1; i <= count; i++) {
const entry = merge(this.factory(), override) const entry = {
...this.factory(),
...override,
}
for (const e in entry) { for (const e in entry) {
if(typeof entry[e] === 'function') { if(typeof entry[e] === 'function') {
entry[e] = entry[e](i) entry[e] = entry[e](i)

View file

@ -34,7 +34,7 @@ http {
gzip_buffers 16 8k; gzip_buffers 16 8k;
gzip_http_version 1.1; gzip_http_version 1.1;
gzip_min_length 256; 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 font/woff2 image/x-icon audio/wav; 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;
map_hash_max_size 128; map_hash_max_size 128;
map_hash_bucket_size 128; map_hash_bucket_size 128;

BIN
originalMedia/audio/pop.mp3 Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,149 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="16.000000pt" height="16.000000pt" viewBox="0 0 16.000000 16.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,16.000000) scale(0.000320,-0.000320)"
fill="#000000" stroke="none">
<path d="M18 46618 c45 -75 122 -207 122 -211 0 -2 25 -45 55 -95 30 -50 55
-96 55 -102 0 -5 5 -10 10 -10 6 0 10 -4 10 -9 0 -5 73 -135 161 -288 89 -153
173 -298 187 -323 14 -25 32 -57 41 -72 88 -149 187 -324 189 -335 2 -7 8 -13
13 -13 5 0 9 -4 9 -10 0 -5 46 -89 103 -187 175 -302 490 -846 507 -876 8 -16
20 -36 25 -45 28 -46 290 -498 339 -585 13 -23 74 -129 136 -236 61 -107 123
-215 137 -240 14 -25 29 -50 33 -56 5 -5 23 -37 40 -70 18 -33 38 -67 44 -75
11 -16 21 -33 63 -109 14 -25 29 -50 33 -56 4 -5 21 -35 38 -65 55 -100 261
-455 269 -465 4 -5 14 -21 20 -35 15 -29 41 -75 103 -180 24 -41 52 -88 60
-105 9 -16 57 -100 107 -185 112 -193 362 -626 380 -660 8 -14 23 -38 33 -55
11 -16 23 -37 27 -45 4 -8 26 -46 48 -85 23 -38 53 -90 67 -115 46 -81 64
-113 178 -310 62 -107 121 -210 132 -227 37 -67 56 -99 85 -148 16 -27 32 -57
36 -65 4 -8 15 -27 25 -42 9 -15 53 -89 96 -165 44 -76 177 -307 296 -513 120
-206 268 -463 330 -570 131 -227 117 -203 200 -348 36 -62 73 -125 82 -140 10
-15 21 -34 25 -42 4 -8 20 -37 36 -65 17 -27 38 -65 48 -82 49 -85 64 -111 87
-153 13 -25 28 -49 32 -55 4 -5 78 -134 165 -285 87 -151 166 -288 176 -305
10 -16 26 -43 35 -59 9 -17 125 -217 257 -445 132 -229 253 -441 270 -471 17
-30 45 -79 64 -108 18 -29 33 -54 33 -57 0 -2 20 -37 44 -77 24 -40 123 -212
221 -383 97 -170 190 -330 205 -355 16 -25 39 -65 53 -90 13 -25 81 -144 152
-265 70 -121 137 -238 150 -260 12 -22 37 -65 55 -95 18 -30 43 -73 55 -95 12
-22 48 -85 80 -140 77 -132 163 -280 190 -330 13 -22 71 -123 130 -225 59
-102 116 -199 126 -217 10 -17 29 -50 43 -72 15 -22 26 -43 26 -45 0 -2 27
-50 60 -106 33 -56 60 -103 60 -105 0 -2 55 -98 90 -155 8 -14 182 -316 239
-414 13 -22 45 -79 72 -124 27 -46 49 -86 49 -89 0 -2 14 -24 30 -48 16 -24
30 -46 30 -49 0 -5 74 -135 100 -176 5 -8 24 -42 43 -75 50 -88 58 -101 262
-455 104 -179 199 -345 213 -370 14 -25 28 -49 32 -55 4 -5 17 -26 28 -45 10
-19 62 -109 114 -200 114 -197 133 -230 170 -295 16 -27 33 -57 38 -65 17 -28
96 -165 103 -180 4 -8 16 -28 26 -45 10 -16 77 -131 148 -255 72 -124 181
-313 243 -420 62 -107 121 -209 131 -227 35 -62 323 -560 392 -678 38 -66 83
-145 100 -175 16 -30 33 -59 37 -65 4 -5 17 -27 29 -47 34 -61 56 -100 90
-156 17 -29 31 -55 31 -57 0 -2 17 -32 39 -67 21 -35 134 -229 251 -433 117
-203 235 -407 261 -451 27 -45 49 -85 49 -88 0 -4 8 -19 19 -34 15 -21 200
-341 309 -533 10 -19 33 -58 51 -87 17 -29 31 -54 31 -56 0 -2 25 -44 55 -94
30 -50 55 -95 55 -98 0 -4 6 -15 14 -23 7 -9 27 -41 43 -71 17 -30 170 -297
342 -594 171 -296 311 -542 311 -547 0 -5 5 -9 10 -9 6 0 10 -4 10 -10 0 -5
22 -47 49 -92 27 -46 58 -99 68 -118 24 -43 81 -140 93 -160 5 -8 66 -114 135
-235 69 -121 130 -227 135 -235 12 -21 259 -447 283 -490 10 -19 28 -47 38
-62 11 -14 19 -29 19 -32 0 -3 37 -69 83 -148 99 -170 305 -526 337 -583 13
-22 31 -53 41 -70 11 -16 22 -37 26 -45 7 -14 82 -146 103 -180 14 -24 181
-311 205 -355 13 -22 46 -80 75 -130 29 -49 64 -110 78 -135 14 -25 51 -88 82
-140 31 -52 59 -102 63 -110 4 -8 18 -33 31 -55 205 -353 284 -489 309 -535
17 -30 45 -78 62 -106 18 -28 36 -60 39 -72 4 -12 12 -22 17 -22 5 0 9 -4 9
-10 0 -5 109 -197 241 -427 133 -230 250 -431 259 -448 51 -90 222 -385 280
-485 37 -63 78 -135 92 -160 14 -25 67 -117 118 -205 51 -88 101 -175 111
-193 34 -58 55 -95 149 -257 51 -88 101 -173 110 -190 9 -16 76 -131 147 -255
72 -124 140 -241 151 -260 61 -108 281 -489 355 -615 38 -66 77 -133 87 -150
35 -63 91 -161 100 -175 14 -23 99 -169 128 -220 54 -97 135 -235 142 -245 4
-5 20 -32 35 -60 26 -48 238 -416 276 -480 10 -16 26 -46 37 -65 30 -53 382
-661 403 -695 10 -16 22 -37 26 -45 4 -8 26 -48 50 -88 24 -41 43 -75 43 -77
0 -2 22 -40 50 -85 27 -45 50 -84 50 -86 0 -3 38 -69 83 -147 84 -142 302
-520 340 -587 10 -19 34 -60 52 -90 18 -30 44 -75 57 -100 14 -25 45 -79 70
-120 25 -41 56 -96 70 -121 14 -25 77 -133 138 -240 62 -107 122 -210 132
-229 25 -43 310 -535 337 -581 11 -19 26 -45 34 -59 17 -32 238 -414 266 -460
11 -19 24 -41 28 -49 3 -7 75 -133 160 -278 84 -146 153 -269 153 -274 0 -5 5
-9 10 -9 6 0 10 -4 10 -10 0 -5 82 -150 181 -322 182 -314 201 -346 240 -415
12 -21 80 -139 152 -263 71 -124 141 -245 155 -270 14 -25 28 -49 32 -55 6 -8
145 -248 220 -380 37 -66 209 -362 229 -395 11 -19 24 -42 28 -49 4 -8 67
-118 140 -243 73 -125 133 -230 133 -233 0 -2 15 -28 33 -57 19 -29 47 -78 64
-108 17 -30 53 -93 79 -139 53 -90 82 -141 157 -272 82 -142 115 -199 381
-659 142 -245 268 -463 281 -485 12 -22 71 -125 132 -230 60 -104 172 -298
248 -430 76 -132 146 -253 156 -270 11 -16 22 -36 26 -44 3 -8 30 -54 60 -103
29 -49 53 -91 53 -93 0 -3 18 -34 40 -70 22 -36 40 -67 40 -69 0 -2 37 -66 81
-142 45 -77 98 -168 119 -204 20 -36 47 -81 58 -100 12 -19 27 -47 33 -62 6
-16 15 -28 20 -28 5 0 9 -4 9 -9 0 -6 63 -118 140 -251 77 -133 140 -243 140
-245 0 -2 18 -33 41 -70 22 -37 49 -83 60 -101 10 -19 29 -51 40 -71 25 -45
109 -189 126 -218 7 -11 17 -29 22 -40 6 -11 22 -38 35 -60 14 -22 37 -62 52
-90 14 -27 35 -62 45 -77 11 -14 19 -29 19 -32 0 -3 18 -35 40 -71 22 -36 40
-67 40 -69 0 -2 19 -35 42 -72 23 -38 55 -94 72 -124 26 -47 139 -244 171
-298 6 -9 21 -36 34 -60 28 -48 37 -51 51 -19 6 12 19 36 29 52 10 17 27 46
38 65 11 19 104 181 208 360 103 179 199 345 213 370 14 25 42 74 64 109 21
34 38 65 38 67 0 2 18 33 40 69 22 36 40 67 40 69 0 3 177 310 199 346 16 26
136 234 140 244 2 5 25 44 52 88 27 44 49 81 49 84 0 2 18 34 40 70 22 36 40
67 40 69 0 2 20 36 43 77 35 58 169 289 297 513 9 17 50 86 90 155 40 69 86
150 103 180 16 30 35 62 41 70 6 8 16 24 22 35 35 64 72 129 167 293 59 100
116 199 127 220 11 20 30 53 41 72 43 72 1070 1850 1121 1940 14 25 65 113
113 195 48 83 96 166 107 185 10 19 28 50 38 68 11 18 73 124 137 235 64 111
175 303 246 427 71 124 173 299 225 390 52 91 116 202 143 248 27 45 49 85 49
89 0 4 6 14 14 22 7 9 28 43 46 76 26 47 251 436 378 655 11 19 29 51 40 70
11 19 101 176 201 348 99 172 181 317 181 323 0 5 5 9 10 9 6 0 10 5 10 11 0
6 8 23 18 37 11 15 32 52 49 82 16 30 130 228 253 440 122 212 234 405 248
430 13 25 39 70 57 100 39 65 69 117 130 225 25 44 50 87 55 95 12 19 78 134
220 380 61 107 129 224 150 260 161 277 222 382 246 425 15 28 47 83 71 123
24 41 43 78 43 83 0 5 4 9 8 9 4 0 13 12 19 28 7 15 23 45 36 67 66 110 277
478 277 483 0 3 6 13 14 21 7 9 27 41 43 71 17 30 45 80 63 110 34 57 375 649
394 685 6 11 16 27 22 35 6 8 26 42 44 75 18 33 41 74 51 90 10 17 24 41 32
55 54 97 72 128 88 152 11 14 19 28 19 30 0 3 79 141 175 308 96 167 175 305
175 308 0 3 6 13 14 21 7 9 26 39 41 66 33 60 276 483 338 587 24 40 46 80 50
88 4 8 13 24 20 35 14 23 95 163 125 215 11 19 52 91 92 160 40 69 80 139 90
155 9 17 103 179 207 360 105 182 200 346 211 365 103 181 463 802 489 845 7
11 15 27 19 35 4 8 29 51 55 95 64 110 828 1433 848 1470 9 17 24 41 33 55 9
14 29 48 45 77 15 28 52 93 82 145 30 51 62 107 71 123 17 30 231 398 400 690
51 88 103 179 115 202 12 23 26 48 32 55 6 7 24 38 40 68 17 30 61 107 98 170
37 63 84 144 103 180 19 36 41 72 48 81 8 8 14 18 14 21 0 4 27 51 59 106 32
55 72 124 89 154 16 29 71 125 122 213 51 88 104 180 118 205 13 25 28 50 32
55 4 6 17 26 28 45 11 19 45 80 77 135 31 55 66 116 77 135 11 19 88 152 171
295 401 694 620 1072 650 1125 11 19 87 152 170 295 83 143 158 273 166 288 9
16 21 36 26 45 6 9 31 52 55 96 25 43 54 94 66 115 11 20 95 164 186 321 91
157 173 299 182 315 9 17 26 46 37 65 12 19 66 114 121 210 56 96 108 186 117
200 8 14 24 40 34 59 24 45 383 664 412 713 5 9 17 29 26 45 15 28 120 210
241 419 36 61 68 117 72 125 4 8 12 23 19 34 35 57 245 420 262 453 11 20 35
61 53 90 17 29 32 54 32 56 0 3 28 51 62 108 33 57 70 119 80 138 10 19 23 42
28 50 5 8 32 53 59 100 27 47 149 258 271 470 122 212 234 405 248 430 30 53
62 108 80 135 6 11 15 27 19 35 4 8 85 150 181 315 96 165 187 323 202 350 31
56 116 202 130 225 5 8 25 42 43 75 19 33 92 159 162 280 149 257 157 271 202
350 19 33 38 67 43 75 9 14 228 392 275 475 12 22 55 96 95 165 40 69 80 139
90 155 24 42 202 350 221 383 9 15 27 47 41 72 14 25 75 131 136 236 61 106
121 210 134 232 99 172 271 470 279 482 5 8 23 40 40 70 18 30 81 141 142 245
60 105 121 210 135 235 14 25 71 124 127 220 56 96 143 247 194 335 51 88 96
167 102 175 14 24 180 311 204 355 23 43 340 590 356 615 5 8 50 87 101 175
171 301 517 898 582 1008 25 43 46 81 46 83 0 2 12 23 27 47 14 23 40 67 56
97 16 30 35 62 42 70 7 8 15 22 18 30 4 8 20 38 37 65 16 28 33 57 37 65 6 12
111 196 143 250 5 8 55 95 112 193 57 98 113 195 126 215 12 20 27 46 32 57 6
11 14 27 20 35 5 8 76 130 156 270 80 140 165 287 187 325 23 39 52 90 66 115
13 25 30 52 37 61 8 8 14 18 14 21 0 4 41 77 92 165 50 87 175 302 276 478
101 176 208 360 236 408 28 49 67 117 86 152 19 35 41 70 48 77 6 6 12 15 12
19 0 7 124 224 167 291 12 21 23 40 23 42 0 2 21 40 46 83 26 43 55 92 64 109
54 95 327 568 354 614 19 30 45 75 59 100 71 128 82 145 89 148 4 2 8 8 8 13
0 5 42 82 94 172 311 538 496 858 518 897 14 25 40 70 58 100 18 30 42 71 53
90 10 19 79 139 152 265 73 127 142 246 153 265 10 19 43 76 72 125 29 50 63
108 75 130 65 116 80 140 87 143 4 2 8 8 8 12 0 8 114 212 140 250 6 8 14 24
20 35 5 11 54 97 108 190 l100 170 -9611 3 c-5286 1 -9614 -1 -9618 -5 -5 -6
-419 -719 -619 -1068 -89 -155 -267 -463 -323 -560 -38 -66 -81 -140 -95 -165
-31 -56 -263 -457 -526 -910 -110 -190 -224 -388 -254 -440 -29 -52 -61 -109
-71 -125 -23 -39 -243 -420 -268 -465 -11 -19 -204 -352 -428 -740 -224 -388
-477 -826 -563 -975 -85 -148 -185 -322 -222 -385 -37 -63 -120 -207 -185
-320 -65 -113 -177 -306 -248 -430 -72 -124 -172 -297 -222 -385 -51 -88 -142
-245 -202 -350 -131 -226 -247 -427 -408 -705 -65 -113 -249 -432 -410 -710
-160 -278 -388 -673 -506 -877 -118 -205 -216 -373 -219 -373 -3 0 -52 82
-109 183 -58 100 -144 250 -192 332 -95 164 -402 696 -647 1120 -85 149 -228
396 -317 550 -212 365 -982 1700 -1008 1745 -10 19 -43 76 -72 125 -29 50 -64
110 -77 135 -14 25 -63 110 -110 190 -47 80 -96 165 -110 190 -14 25 -99 171
-188 325 -89 154 -174 300 -188 325 -13 25 -64 113 -112 195 -48 83 -140 242
-205 355 -65 113 -183 317 -263 454 -79 137 -152 264 -163 282 -50 89 -335
583 -354 614 -12 19 -34 58 -50 85 -15 28 -129 226 -253 440 -124 215 -235
408 -247 430 -12 22 -69 121 -127 220 -58 99 -226 389 -373 645 -148 256 -324
561 -392 678 -67 117 -134 232 -147 255 -13 23 -33 59 -46 80 l-22 37 -9615 0
-9615 0 20 -32z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View file

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

View file

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 126 KiB

View file

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 174 KiB

View file

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View file

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View file

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View file

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View file

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1007.922 821.827"><defs><style>.a{fill:#fff;}.b{fill:url(#a);}.c{mask:url(#b);}.d{fill:url(#c);}.e{mask:url(#d);}.f{fill:url(#e);}.g{fill:url(#f);}.h{mask:url(#g);}.i{fill:url(#h);}.j{fill:#195abd;}.k{fill:url(#i);}</style><linearGradient id="a" x1="700.766" y1="597.024" x2="749.765" y2="597.024" gradientTransform="translate(86.603 -142.296) scale(0.867 1.307)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-opacity="0.13"/><stop offset="0.994" stop-opacity="0"/></linearGradient><mask id="b" x="317.137" y="651.827" width="170" height="205.208" maskUnits="userSpaceOnUse"><g transform="translate(-8.064 -116.521)"><rect class="a" x="367.701" y="870.953" width="85" height="85" transform="translate(766.054 -22.512) rotate(45)"/></g></mask><radialGradient id="c" cx="410.201" cy="853.349" r="85" gradientTransform="translate(715.49 -156.637) rotate(45)" gradientUnits="userSpaceOnUse"><stop offset="0.5" stop-opacity="0.13"/><stop offset="0.994" stop-opacity="0"/></radialGradient><mask id="d" x="837.922" y="95.835" width="205.208" height="205.208" maskUnits="userSpaceOnUse"><g transform="translate(-8.064 -116.521)"><rect class="a" x="876.038" y="260.012" width="170" height="85" transform="translate(1426.685 1195.977) rotate(-135)"/></g></mask><radialGradient id="e" cx="1051.126" cy="1265.852" r="85" gradientTransform="translate(771.087 1854.394) rotate(-135)" xlink:href="#c"/><linearGradient id="f" x1="1880.8" y1="34.286" x2="1929.799" y2="34.286" gradientTransform="matrix(0.867, 0, 0, -0.796, -1446.031, 767.147)" xlink:href="#a"/><mask id="g" x="-35.208" y="299.482" width="205.208" height="205.208" maskUnits="userSpaceOnUse"><g transform="translate(-8.064 -116.521)"><rect class="a" x="-21.988" y="463.659" width="170" height="85" transform="translate(-339.453 192.807) rotate(-45)"/></g></mask><radialGradient id="h" cx="27.608" cy="2001.37" r="85" gradientTransform="matrix(0.707, -0.707, -0.707, -0.707, 1480.66, 1854.394)" xlink:href="#c"/><linearGradient id="i" x1="308.378" y1="811.629" x2="919.318" y2="200.689" gradientTransform="translate(-178.117 582.307) rotate(-45)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2987e6"/><stop offset="0.994" stop-color="#58c1f5"/></linearGradient></defs><title>Todo</title><rect class="b" x="694.422" y="269.785" width="42.5" height="736.5" transform="translate(652.71 -435.701) rotate(45)"/><g class="c"><circle class="d" cx="402.137" cy="736.827" r="85"/></g><g class="e"><circle class="f" cx="922.922" cy="216.043" r="85"/></g><rect class="g" x="185.305" y="515.608" width="42.5" height="448.5" transform="translate(867.705 1000.439) rotate(135)"/><g class="h"><circle class="i" cx="85" cy="419.69" r="85"/></g><rect class="j" x="164.378" y="319.982" width="288" height="576" rx="42.5" transform="translate(-347.651 279.609) rotate(-45)"/><rect class="k" x="469.848" y="74.159" width="288" height="864" rx="42.5" transform="translate(529.636 -402.327) rotate(45)"/></svg>

After

Width:  |  Height:  |  Size: 3 KiB

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="256px" height="256px" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<g>
<path d="M224.001997,0 L31.9980026,0 C14.3579381,0.0394964443 0.0614809418,14.336846 0,32 L0,224 C0,241.6 14.3971038,256 31.9980026,256 L224.001997,256 C241.602896,256 256,241.6 256,224 L256,32 C256,14.4 241.602896,0 224.001997,0" fill="#E44332"></path>
<path d="M54.132778,120.802491 C58.5960224,118.196275 154.476075,62.477451 156.667847,61.1862981 C158.859619,59.9110855 158.97917,55.9898065 156.508446,54.5711324 C154.053661,53.1604284 149.391165,50.4824817 147.661658,49.4543415 C145.192242,48.0957707 142.191169,48.132074 139.755339,49.5499825 C138.527947,50.2672896 56.6035026,97.8486625 53.8697654,99.4107981 C50.5781227,101.291737 46.5372925,101.323617 43.2695601,99.4107981 L0,74.0181257 L0,95.6011002 C10.5205046,101.801822 36.7181549,117.200015 43.062338,120.826401 C46.8481256,122.978322 50.4745117,122.930502 54.1407481,120.802491" fill="#FFFFFF"></path>
<path d="M54.132778,161.609296 C58.5960224,159.00308 154.476075,103.284257 156.667847,101.993104 C158.859619,100.717891 158.97917,96.7966121 156.508446,95.377938 C154.053661,93.9672339 149.391165,91.2892873 147.661658,90.2611471 C145.192242,88.9025763 142.191169,88.9388796 139.755339,90.3567881 C138.527947,91.0740952 56.6035026,138.655468 53.8697654,140.217604 C50.5781227,142.098542 46.5372925,142.130423 43.2695601,140.217604 L0,114.824931 L0,136.407906 C10.5205046,142.608627 36.7181549,158.00682 43.062338,161.633206 C46.8481256,163.785128 50.4745117,163.737307 54.1407481,161.609296" fill="#FFFFFF"></path>
<path d="M54.132778,204.966527 C58.5960224,202.360311 154.476075,146.641487 156.667847,145.350335 C158.859619,144.075122 158.97917,140.153843 156.508446,138.735169 C154.053661,137.324465 149.391165,134.646518 147.661658,133.618378 C145.192242,132.259807 142.191169,132.29611 139.755339,133.714019 C138.527947,134.431326 56.6035026,182.012699 53.8697654,183.574835 C50.5781227,185.455773 46.5372925,185.487654 43.2695601,183.574835 L0,158.182162 L0,179.765137 C10.5205046,185.965858 36.7181549,201.364051 43.062338,204.990437 C46.8481256,207.142359 50.4745117,207.094538 54.1407481,204.966527" fill="#FFFFFF"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="256px" height="256px" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<defs>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-1">
<stop stop-color="#0091E6" offset="0%"></stop>
<stop stop-color="#0079BF" offset="100%"></stop>
</linearGradient>
</defs>
<g>
<g>
<rect fill="url(#linearGradient-1)" x="0" y="0" width="256" height="256" rx="25"></rect>
<rect fill="#FFFFFF" x="144.64" y="33.28" width="78.08" height="112" rx="12"></rect>
<rect fill="#FFFFFF" x="33.28" y="33.28" width="78.08" height="176" rx="12"></rect>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 829 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

View file

@ -25,7 +25,6 @@
"easymde": "^2.15.0", "easymde": "^2.15.0",
"highlight.js": "11.2.0", "highlight.js": "11.2.0",
"is-touch-device": "1.0.1", "is-touch-device": "1.0.1",
"lodash": "4.17.21",
"marked": "3.0.4", "marked": "3.0.4",
"register-service-worker": "1.7.2", "register-service-worker": "1.7.2",
"snake-case": "3.0.4", "snake-case": "3.0.4",

BIN
public/audio/pop.mp3 Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

11
run.sh
View file

@ -5,15 +5,18 @@
VIKUNJA_API_URL="${VIKUNJA_API_URL:-"/api/v1"}" VIKUNJA_API_URL="${VIKUNJA_API_URL:-"/api/v1"}"
VIKUNJA_HTTP_PORT="${VIKUNJA_HTTP_PORT:-80}" VIKUNJA_HTTP_PORT="${VIKUNJA_HTTP_PORT:-80}"
VIKUNJA_HTTPS_PORT="${VIKUNJA_HTTP_PORT:-443}" VIKUNJA_HTTPS_PORT="${VIKUNJA_HTTPS_PORT:-443}"
echo "Using $VIKUNJA_API_URL as default api url"
# Escape the variable to prevent sed from complaining # Escape the variable to prevent sed from complaining
VIKUNJA_API_URL=$(echo $VIKUNJA_API_URL |sed 's/\//\\\//g') VIKUNJA_API_URL=$(echo $VIKUNJA_API_URL |sed 's/\//\\\//g')
sed -i "s/http\:\/\/localhost\:3456\/api\/v1/$VIKUNJA_API_URL/g" /usr/share/nginx/html/index.html 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/listen 80/listen $VIKUNJA_HTTP_PORT/g" nginx.conf sed -i "s/listen 80/listen $VIKUNJA_HTTP_PORT/g" /etc/nginx/nginx.conf
sed -i "s/listen 443/listen $VIKUNJA_HTTPS_PORT/g" nginx.conf sed -i "s/listen 443/listen $VIKUNJA_HTTPS_PORT/g" /etc/nginx/nginx.conf
# Set the uid and gid of the nginx run user # Set the uid and gid of the nginx run user
usermod --non-unique --uid ${PUID} nginx usermod --non-unique --uid ${PUID} nginx

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

1
src/assets/llama.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="145.4" height="204.5" xml:space="preserve"><defs><clipPath id="a" clipPathUnits="userSpaceOnUse"><path d="M5210 5148.5c-111.4 0-201.8 62.7-201.8 140s90.4 140 201.8 140c111.5 0 201.9-62.7 201.9-140s-90.4-140-201.9-140"/></clipPath></defs><path fill="#fff" d="M145 129.8c-1.5 11.7-6.3 15-6.3 15 8.2 4.3 6.9 16.5 4.5 21-1.5 3-3.6 3-3.6 3 7.4 11-1.4 18.7-1.4 18.7a39 39 0 0 1 1.7 17h-109c-.7-1.7-1.4-4.8-.5-10.3 1.8-11.5 5.5-16.1 6.3-17 0 0-7-10.2-6.3-19.4 1-14.6 4.9-16.7 4.9-16.7-7.4-10-2.4-20.4.4-23.8 0-1.3-3.9-14.8-1.1-27 1-4 3-15.3 3.5-15.9-.5-1.4-3-6.4 1-16.3 1.8-4.2 4.2-7.6 5.9-9.7l1.2-2.8C39.2 23 43-.3 46.9 0c7.2.6 17.2 27.3 18 29.1.2.7 7.8 1.3 16.2 1.9 7.8-.6 15.8-1 20-.4 5.2.9 9.6 2.4 13.3 4.1 5 .7 6.9.9 7.2.3 1.6-3.3 6.9-26.7 16.3-32.5 5.1-3 11.5 36.4-1 48.7 0 0-1 3.7-1.5 6.7 3.6 8 .3 18.7.3 18.7 15 6.2 1.7 28.3 1.7 28.3 3.3 3.6 9.7 8 7.5 25"/><path fill="#fef2e2" d="M136.5 11.6c3.1-5.3 9.9 20-3.2 32.3-3.2 3-3.3-2.1-1-17 .7-5.2 2-11.4 4.2-15.3M50 9c-3.4-5.1-8.8 20.5 5 32.1C58.2 44 58 38.8 55 24c-1-5.1-2.7-11.3-5-15M53.3 60.4c8.4-8.7 33.6-6.6 33.6-6.6s25-3 33.7 5.5c0 0 27.6 61.4-32.7 62.8-60.2.5-34.6-61.7-34.6-61.7"/><g clip-path="url(#a)" transform="matrix(.04413 0 0 .04413 -169.3 -148)"><path fill="#fee8de" d="M5008.2 5148.5h403.7v280h-403.7Z"/></g><path fill="#fee8de" d="M112.6 80.2c-4.9 0-8.9 2.8-8.9 6.2 0 3.4 4 6.2 9 6.2 4.9 0 8.9-2.8 8.9-6.2 0-3.4-4-6.2-9-6.2"/><path fill="#231f20" d="M68.3 74.4a3 3 0 1 0 6-.1c0-1.7-1.4-4.2-3-4.2-1.7 0-3 2.6-3 4.3M100.4 75a3 3 0 1 0 5.9 0c0-1.7-1.4-4.2-3-4.2-1.7 0-3 2.6-3 4.3"/><path fill="#eedbcc" d="M61.5 100.2c-.1-7.7 11.7-16.7 24.2-16.9 12.6-.2 24 8.2 24 15.9.1 4-3.5 6.1-7.9 9.1-4.3 3-9 9.8-15.9 10-7 0-11.7-6.7-16.2-9.6-4.4-2.7-8.1-4.5-8.2-8.5"/><path fill="#fff" d="M48.8 44.7c.3-2.6 2.3-4.8 5-4.7-1.4-2.2-2.3-7 2.2-9.3 2.8-1.3 6 1.1 6 1.1s.6-5.6 6.7-6.7c6.4-1.1 10 5.2 10 5.2-.2-5 8.5-8 13.2-7.2 5.9 1 8.7 5.3 8.7 5.3 11.6-7 16 4 16 4 2.5-6.2 11.7-4.3 14.6-.6 3.7 4.9-.7 9-.7 9s8 5.4 4.5 11.6c-4 7.1-11.5 2.7-11.5 2.7-3 15-14.6 2-14.6 2-.9 7-4 13-12.8 11-6-1.4-8-9.4-8-9.4-2 8.2-8.4 7-10.8 4.7a5.8 5.8 0 0 1-1.6-3.6C70 67.3 66 58.6 66 58.6c-4.9 3-9.7 2.8-12.2-.5-1.4-1.9-1.8-4-1-7.4-2.1-.6-4.4-2.3-4-6"/><path fill="#fef2e2" d="m128.1 42.8.7.3a1.8 1.8 0 0 1 .8 1l.1.6-.1 1.3a7.8 7.8 0 0 1-.5 1.3c-.4.8-.9 1.5-1.6 2l-.6.2h-.7c-.2 0-.4 0-.7-.2l-.6-.3-.6-.4.1.7.2 1.1-.1 1.2-.3 1-.5 1-.6.7-.4.4-.4.3-.8.5-1 .3c-.3 0-.6 0-1 .2h-2l-1.1-.2c-.4 0-.8-.2-1.1-.3-.4 0-.7-.2-1.1-.3l-1.1-.4-1.1-.5-.1.2.8.9 1 .8 1 .7 1.2.5 1.2.4 1.3.3h1.3l1.4-.3 1.3-.5 1.1-.8.5-.5.4-.6c.3-.3.5-.8.7-1.2l.3-1.3v-1.3c0-.4 0-.8-.2-1.2L125 49l-.5.4 1.5.8 1 .2h1c.6-.2 1.1-.5 1.6-1a5.2 5.2 0 0 0 1.1-1.5 6.2 6.2 0 0 0 .5-2.7l-.1-.9-.5-.9-.7-.7-1-.3h-.4l-.4.1v.2M89.5 33.5l.3-.4.2-.4v-1c0-.3 0-.6-.2-.9L89 30l-.7-.5-.9-.4-1.8-.3-1 .1-.8.3c-.6.3-1.2.7-1.5 1.2l-.5.9-.2.9.1 1.7.5-.3-1-.7-1-.7-1.2-.5-1.4-.2h-1.3l-.7.2-.7.2-1.2.7-1 1-.8 1-.6 1.3-.3 1.3-.1 1.3v1.3l.2 1.2.3 1.2.5 1.2h.2V42l.1-1.2c0-.3 0-.7.2-1 0-.5 0-.8.2-1.2l.3-1 .4-1 .4-1c.3-.2.4-.5.6-.8l.7-.7.8-.6.4-.2.5-.2 1-.2 1-.1c.4 0 .7 0 1.1.2.4 0 .7.2 1 .4l1 .6.6.3v-.6c-.1-.3-.2-.5-.1-.8v-.7l.4-.6.4-.4c.7-.5 1.6-.6 2.5-.7a6 6 0 0 1 1.4.1l1.2.5c.2 0 .4.2.5.3l.4.5.2.6v.8h.1M63.3 54.2l-.5.1a2 2 0 0 1-.6 0l-.3.1h-.4l-.9-.3c-.3 0-.6-.2-.9-.4-.3-.2-.6-.3-.8-.6l-.8-.7c-.2-.3-.5-.5-.6-.8l-.2-.5-.2-.4-.4-.8-.3-.7V49l-.1-.3v-1.2l-.2-.1-.5.4c-.2.1-.3.3-.4.6l-.4 1v1.1l.4 1.2.4.6.4.5 1 .9 1.1.7 1.2.5 1.1.2H62l.4-.1c.3 0 .5-.2.6-.3l.5-.2v-.2M111.8 40.1l.1-.5.2-.6v-.7c0-.3 0-.6-.2-1l-.3-.8-.5-1-.7-.8c-.2-.2-.5-.5-.8-.6l-.4-.3-.4-.2-.7-.5c-.3 0-.5-.2-.7-.3l-.3-.1h-.3l-.6-.2h-.6v-.2s0-.2.4-.5l.6-.3c.3-.2.6-.3 1-.3l1.1.1 1.2.5.5.4.5.5.8 1 .6 1.2.4 1.2.2 1.2-.1 1-.1.5-.2.4-.2.5-.4.5h-.1"/><path fill="#231f20" d="M85.3 88.8c4.2 0 12.3 0 10.8 3.3-.8 1.7-5.1 4-10.7 4.2-5.6 0-10-2.3-10.8-4C73 89 81 88.8 85.3 88.8"/><path fill="#231f20" d="M83.8 95.5c-.4 3.7.5 7.2 3.8 9.2 3.6 2.2 8.2.8 11.6-1 1.3-.7.1-2.6-1.1-2-2.7 1.5-5.6 2.4-8.6 1.4-3.3-1-3.8-4.6-3.5-7.6.2-1.4-2-1.3-2.2 0"/><path fill="#231f20" d="M83.3 96.3c0 2.5-1 5-3 6.4-3.2 2.2-6.3-.3-8.2-2.7-.9-1.1-2.4.4-1.6 1.5 2.3 3 6 5.5 9.9 3.6a9.5 9.5 0 0 0 5-8.8c0-1.4-2.2-1.4-2.1 0"/></svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.5 KiB

1
src/assets/logo-full.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.9 KiB

12
src/assets/logo.svg Normal file
View file

@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="256" height="256">
<path d="M2268.2 2512.3a953.7 953.7 0 0 1-50 57c-180.5 189.5-426.2 294-691.6 294A953.7 953.7 0 0 1 847.8 2582a952.7 952.7 0 0 1-281.2-678.8 953.8 953.8 0 0 1 281.2-678.9 953.7 953.7 0 0 1 678.8-281.1 953.7 953.7 0 0 1 678.8 281.1 953.7 953.7 0 0 1 281.2 678.9c0 219.2-78.9 437.2-218.4 609" style="fill:#196aff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
<path d="M1823.7 1650.9c35.7 104.2 94.7 136.1 102 297 2.6 56.5-14.7 236-14.7 236s28 72-25.8 152.3c-83.5 124.3-255.4 132.8-345.7 132.8-90.3 0-260.2-8.5-343.7-132.8C1142 2256 1170 2184 1170 2184s-9.5-92.4-16.7-173.8c-1.7-19.1.1-94.7 2.4-113a453 453 0 0 1 25.8-96.2c14.4-39.6 36.8-79.9 54-120.5 51.8-122.8 8.4-274.9 11.1-407.3 2.2-94-20-189.3-28.7-281.2a960.4 960.4 0 0 1 308.7-50.6 958.6 958.6 0 0 1 344.9 63.6c-20.4 115-44.1 224.2-47.8 265.9-10.6 125.9-41.3 259.4 0 380" style="fill:#fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36655635" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
<path d="M1162.9 2383.9c1.1-18.8 3-38 8.3-56.2 1.6-5.7 4-19.7 11.4-21.8 9-2.6 25.9 8.3 32.3 13 12.3 9 23.9 18.5 36.2 27.6 8 6 16.5 10.5 24.3 16.5 8.4 6.6 14.7 14.5 21.7 22.2 8.4 9.4 14.8 19 21.3 29.5 5.1 8.2 37.1 13.5 42.2 21 5.6 8.3 1 18.6 1 28.7 0 74.2 4.4 147.6 6.1 220.3 1.8 50 21.4 109.2-53.4 85.8-160.3-50-158.5-271.3-151.4-386.6M1869.1 2279.7c-1.6 1.8-4.2 3.2-6.3 4.8a208 208 0 0 0-25.1 21.5c-9.4 9.6-19.2 19-28.2 28.9-7.9 8.7-17.3 16.6-25 25.6-5.1 6-10 12.3-14.6 18.5-2.3 3.2-3.5 7-5.3 10.4-2.7 5-40 10.1-36.2 15 6.3 8.3 20.3 15.4 23.7 25 17.2 48.6 24.8 244.5 26.8 294.5 5.4 127.8 117.6-6.3 137.2-57.7 57-149.7 23.2-258.8-46.3-386.6" style="fill:#fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
<path d="M1716.5 1787.9c-.1 73.8-9.3 103.6-50.4 139.7-25.8 22.6-55.9 31.2-103.8 30-47.9 1.2-82.4-13.4-107.3-39.2-37.5-39-47.4-62-47.5-135.9 0-39.9 43-128.1 55.7-148.5 21.3-36 60.6-48.9 99.1-46.2 38.6-2.7 77.9 10.3 99.1 46.2 12.8 20.4 55.1 107 55 153.9" style="fill:#f1e6d3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
<path d="M1226.6 2316c-9.6 86.2-38.6 240 61.5 331.3 11 10.1 14-24.2 15.8-38 2.6-19 0-73.5.4-92.6.7-36.1 8.3-55 4.7-71.5-9.6-45-17.3-42.2-26.5-69.6-18.3-54.4-53.3-83-55.9-59.5M1851.7 2333c10.3-18.2 37 80.3 45.4 123.2 8 40.3 18 93.8 4 133.9-7.4 21.5-53 84.5-58.4 62.9-2-8.5-3.2-71.1-8.3-101.1-6.4-37.1-18-73.8-18-111.6-.2-84.5 25.3-88 35.3-107.2" style="fill:#f1d7d4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
<path d="M1522 1319.7c-2.2-6.5-18.6-11.4-24.8-13.3-14.9-4.9-28.1 6.9-36.4 16.8-11.6 13.7-11.3 35.6-16.2 51.6-2.9 9.7-19.5 11-24.5 2-16.6-29.8-81.1 26.4-66.1 45.2 9.9 12.3-13.8 23.2-23.6 11-29-36.1 49-103.4 93.6-85.2 2-9 4-18 8-26.6 7.4-16.9 23.9-27.8 41-37 23.1-12.4 68.2 9.5 75 30.3 4.9 14.5-21.2 19.7-26 5.2M1727.6 1538.2c2.4-10 2.8-44-16-25.4-7.5 7.5-22.6 3-23.2-7-1.4-23.4-24.9-24-45.1-16.9-16 5.6-24.6-16.6-8.6-22.1 29.7-10.4 62-4.6 74.7 17.8 10.1-4.7 21.5-6 30.7 2.6 16 15 18.4 36.2 13.7 55.7-3.5 14.8-29.7 10.1-26.2-4.7M1775 1049.2c-7-14.3-19.8-13.4-33.6-7.4-10.1 4.4-22.6-2.8-19.6-13 6.2-20.6-19.7-26.6-37.3-19.3-15.4 6.5-28.8-13.8-13.2-20.3 31.6-13.2 71.7-1.6 77.5 26.2 20.4-3.3 39.8 2.4 49.4 22.3 6.7 13.6-16.4 25.4-23.2 11.5M1569.8 2153.3c-3.3-20.2-41.1 3.3-50.5 9.7-8.3 5.5-19 2.1-20-7.3-1.4-12.7-18.5-9-26.3-7.4-14.8 3-27.4 12.2-27.7 26-.4 13.6 8.2 27.7 12.6 40.4 2.9 8-8.7 17-17.2 11.5-15.2-9.7-88.7-18.5-59.4 13.6 9.3 10.2-7.1 24.8-16.6 14.5-13.5-14.8-22.6-48.7 6.6-56 15.5-3.7 37.8-3.5 56.8.8-8-25.5-9.6-48.8 23.2-65.1 22.1-11.1 52.5-11 65.4 6 27.2-14.5 69.7-28.7 75.6 7.8 2.1 13-20.4 18.5-22.5 5.5" style="fill:#faeee0;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
<path d="M1443 1685.6c39.4-3.4 78.8-12.3 118.5-10.9 25.4 1 51.7 4.5 76.8 8.2 18.2 2.7 40.5 6 52.7 19.4 1-45-92.6-59.1-128.9-60-42.1-1-89.5 17.2-119 43.3" style="fill:#494949;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
<path d="M1549.4 1779.5a353.5 353.5 0 0 1-2.7-87.3c.7-7.6-1.3-25.7 8.8-29.5 8.2-3 18.3 2.7 19.7 10.1 2.2 12.5-3 28.2-3.5 41-.5 14.9 0 29.8 1.6 44.7 1 8.8 5.9 20.7-4.2 27-7.4 4.5-18.3 2.8-19.7-6" style="fill:#494949;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
<path d="M1626 1849.7c-23.7-1-45.7-14.2-63.4-27-16.1 10.7-40.5 20.5-60.7 14.8-12-3.4-1.1-7.1 4-10.3 9.2-6.2 16.8-14.2 23.7-22.4 10.3-12.6 19.6-25.8 30.7-38 7.6 5.6 15 11.1 21.6 17.6 3.1 3 28.5 37 32.4 42.7 2.4 3.6 5 7.4 7.8 10.8 2.9 3.5 11 9 3.9 11.8" style="fill:#494949;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
<path d="M1326.5 2010c11.7 30.3 24.3 68.4 56.3 62.4 24.2-5.2 56.7-86.2 36-78.2-11.3 4.4-20.3 41.1-41.4 46-13.4 3-32-43.6-50-48.4-8.7-2.3-4.3 10.4-.9 18.2M1670.6 2010c11.7 30.3 24.2 68.4 56.3 62.4 24.2-5.2 56.7-86.2 35.9-78.2-11.3 4.4-20.2 41.1-41.3 46-13.5 3-32-43.6-50-48.4-8.7-2.3-4.4 10.4-1 18.2" style="fill:#2c3844;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:.36633128" transform="matrix(.13333 0 0 -.13333 -75.5 381.8)"/>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View file

@ -0,0 +1,44 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1007.9 821.8">
<defs>
<radialGradient id="c" cx="410.2" cy="853.3" r="85" gradientTransform="rotate(45 546.8 785.4)" gradientUnits="userSpaceOnUse">
<stop offset=".5" stop-opacity=".1"/>
<stop offset="1" stop-opacity="0"/>
</radialGradient>
<radialGradient id="e" cx="1051.1" cy="1265.9" r="85" gradientTransform="rotate(-135 769.6 767.5)" xlink:href="#c"/>
<radialGradient id="h" cx="27.6" cy="2001.4" r="85" gradientTransform="scale(1 -1) rotate(45 2979.2 860.2)" xlink:href="#c"/>
<linearGradient id="a" x1="700.8" y1="597" x2="749.8" y2="597" gradientTransform="matrix(.867 0 0 1.307 86.6 -142.3)" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-opacity=".1"/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<linearGradient id="f" x1="1880.8" y1="34.3" x2="1929.8" y2="34.3" gradientTransform="matrix(.867 0 0 -.796 -1446 767.1)" xlink:href="#a"/>
<linearGradient id="i" x1="308.4" y1="811.6" x2="919.3" y2="200.7" gradientTransform="rotate(-45 613.8 506.2)" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#2987e6"/>
<stop offset="1" stop-color="#58c1f5"/>
</linearGradient>
<mask id="b" x="317.1" y="651.8" width="170" height="205.2" maskUnits="userSpaceOnUse">
<path class="a" transform="rotate(45 546.8 845.5)" d="M367.7 871h85v85h-85z"/>
</mask>
<mask id="d" x="837.9" y="95.8" width="205.2" height="205.2" maskUnits="userSpaceOnUse">
<path class="a" transform="rotate(-135 932.9 246)" d="M876 260h170v85H876z"/>
</mask>
<mask id="g" x="-35.2" y="299.5" width="205.2" height="205.2" maskUnits="userSpaceOnUse">
<path class="a" transform="rotate(-45 -81.7 457.6)" d="M-22 463.7h170v85H-22z"/>
</mask>
<style>
.a{fill:#fff}
</style>
</defs>
<path transform="rotate(45 852.3 570)" style="fill:url(#a)" d="M694.4 269.8h42.5v736.5h-42.5z"/>
<g style="mask:url(#b)">
<circle cx="402.1" cy="736.8" r="85" style="fill:url(#c)"/>
</g>
<g style="mask:url(#d)">
<circle cx="922.9" cy="216" r="85" style="fill:url(#e)"/>
</g>
<path transform="rotate(135 226.7 680)" style="fill:url(#f)" d="M185.3 515.6h42.5v448.5h-42.5z"/>
<g style="mask:url(#g)">
<circle cx="85" cy="419.7" r="85" style="fill:url(#h)"/>
</g>
<rect x="164.4" y="320" width="288" height="576" rx="42.5" transform="rotate(-45 163.7 559.5)" style="fill:#195abd"/>
<rect x="469.8" y="74.2" width="288" height="864" rx="42.5" transform="rotate(45 750.5 438.2)" style="fill:url(#i)"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View file

@ -0,0 +1,6 @@
<svg width="256" height="256" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid">
<path d="M224 0H32A32 32 0 0 0 0 32v192a32 32 0 0 0 32 32h192a32 32 0 0 0 32-32V32a32 32 0 0 0-32-32" fill="#E44332"/>
<path d="m54.1 120.8 102.6-59.6c2.2-1.3 2.3-5.2-.2-6.6l-8.8-5.1a8 8 0 0 0-8 0c-1.2.8-83.1 48.3-85.8 50-3.3 1.8-7.4 1.8-10.6 0L0 74v21.6l43 25.2c3.8 2.2 7.5 2.1 11.1 0" fill="#FFF"/>
<path d="M54.1 161.6 156.7 102c2.2-1.3 2.3-5.2-.2-6.6l-8.8-5.1a8 8 0 0 0-8 0l-85.8 50c-3.3 1.8-7.4 1.8-10.6 0L0 114.7v21.6l43 25.2c3.8 2.2 7.5 2.1 11.1 0" fill="#FFF"/>
<path d="m54.1 205 102.6-59.6c2.2-1.3 2.3-5.2-.2-6.7l-8.8-5a8 8 0 0 0-8 0L54 183.6c-3.3 1.9-7.4 1.9-10.6 0L0 158.2v21.6L43 205c3.8 2.1 7.5 2 11.1 0" fill="#FFF"/>
</svg>

After

Width:  |  Height:  |  Size: 745 B

View file

@ -0,0 +1,11 @@
<svg width="256" height="256" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid">
<defs>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="a">
<stop stop-color="#0091E6" offset="0%"/>
<stop stop-color="#0079BF" offset="100%"/>
</linearGradient>
</defs>
<rect fill="url(#a)" width="256" height="256" rx="25"/>
<rect fill="#FFF" x="144.6" y="33.3" width="78.1" height="112" rx="12"/>
<rect fill="#FFF" x="33.3" y="33.3" width="78.1" height="176" rx="12"/>
</svg>

After

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View file

@ -6,7 +6,7 @@
> >
<div class="container has-text-centered link-share-view"> <div class="container has-text-centered link-share-view">
<div class="column is-10 is-offset-1"> <div class="column is-10 is-offset-1">
<img alt="Vikunja" class="logo" src="/images/logo-full.svg"/> <img alt="Vikunja" class="logo" :src="logoUrl" />
<h1 <h1
:style="{ 'opacity': currentList.title === '' ? '0': '1' }" :style="{ 'opacity': currentList.title === '' ? '0': '1' }"
class="title"> class="title">
@ -27,8 +27,15 @@
import {mapState} from 'vuex' import {mapState} from 'vuex'
import {CURRENT_LIST} from '@/store/mutation-types' import {CURRENT_LIST} from '@/store/mutation-types'
import logoUrl from '@/assets/logo-full.svg'
export default { export default {
name: 'contentLinkShare', name: 'contentLinkShare',
data() {
return {
logoUrl,
}
},
computed: mapState({ computed: mapState({
currentList: CURRENT_LIST, currentList: CURRENT_LIST,
background: 'background', background: 'background',

View file

@ -1,7 +1,7 @@
<template> <template>
<div class="no-auth-wrapper"> <div class="no-auth-wrapper">
<div class="noauth-container"> <div class="noauth-container">
<img alt="Vikunja" src="/images/logo-full.svg" width="400" height="117"/> <img alt="Vikunja" :src="logoUrl" width="400" height="117" />
<div class="message is-info" v-if="motd !== ''"> <div class="message is-info" v-if="motd !== ''">
<div class="message-header"> <div class="message-header">
<p>{{ $t('misc.info') }}</p> <p>{{ $t('misc.info') }}</p>
@ -18,8 +18,15 @@
<script> <script>
import {mapState} from 'vuex' import {mapState} from 'vuex'
import logoUrl from '@/assets/logo-full.svg'
export default { export default {
name: 'contentNoAuth', name: 'contentNoAuth',
data() {
return {
logoUrl,
}
},
created() { created() {
this.redirectToHome() this.redirectToHome()
}, },

View file

@ -2,7 +2,7 @@
<div :class="{'is-active': menuActive}" class="namespace-container"> <div :class="{'is-active': menuActive}" class="namespace-container">
<div class="menu top-menu"> <div class="menu top-menu">
<router-link :to="{name: 'home'}" class="logo"> <router-link :to="{name: 'home'}" class="logo">
<img alt="Vikunja" src="/images/logo-full.svg" width="164" height="48"/> <img alt="Vikunja" :src="logoUrl" width="164" height="48"/>
</router-link> </router-link>
<ul class="menu-list"> <ul class="menu-list">
<li> <li>
@ -162,6 +162,8 @@ import NamespaceSettingsDropdown from '@/components/namespace/namespace-settings
import draggable from 'vuedraggable' import draggable from 'vuedraggable'
import {calculateItemPosition} from '@/helpers/calculateItemPosition' import {calculateItemPosition} from '@/helpers/calculateItemPosition'
import logoUrl from '@/assets/logo-full.svg'
export default { export default {
name: 'navigation', name: 'navigation',
data() { data() {
@ -173,6 +175,7 @@ export default {
ghostClass: 'ghost', ghostClass: 'ghost',
}, },
listUpdating: {}, listUpdating: {},
logoUrl,
} }
}, },
components: { components: {

View file

@ -7,8 +7,7 @@
> >
<div class="navbar-brand"> <div class="navbar-brand">
<router-link :to="{name: 'home'}" class="navbar-item logo"> <router-link :to="{name: 'home'}" class="navbar-item logo">
<img width="164" height="48" alt="Vikunja" src="/images/logo-full-pride.svg" v-if="(new Date()).getMonth() === 5"/> <img width="164" height="48" alt="Vikunja" :src="logoUrl" />
<img width="164" height="48" alt="Vikunja" src="/images/logo-full.svg" v-else/>
</router-link> </router-link>
<a <a
@click="$store.commit('toggleMenu')" @click="$store.commit('toggleMenu')"
@ -103,6 +102,9 @@ import ListSettingsDropdown from '@/components/list/list-settings-dropdown.vue'
import Dropdown from '@/components/misc/dropdown.vue' import Dropdown from '@/components/misc/dropdown.vue'
import Notifications from '@/components/notifications/notifications.vue' import Notifications from '@/components/notifications/notifications.vue'
import logoUrl from '@/assets/logo-full.svg'
import logoFullPrideUrl from '@/assets/logo-full-pride.svg'
export default { export default {
name: 'topNavigation', name: 'topNavigation',
components: { components: {
@ -111,7 +113,11 @@ export default {
ListSettingsDropdown, ListSettingsDropdown,
Update, Update,
}, },
computed: mapState({ computed: {
logoUrl() {
return (new Date()).getMonth() === 5 ? logoFullPrideUrl : logoUrl
},
...mapState({
userInfo: state => state.auth.info, userInfo: state => state.auth.info,
userAvatar: state => state.auth.avatarUrl, userAvatar: state => state.auth.avatarUrl,
userAuthenticated: state => state.auth.authenticated, userAuthenticated: state => state.auth.authenticated,
@ -121,6 +127,7 @@ export default {
privacyPolicyUrl: state => state.config.legal.privacyPolicyUrl, privacyPolicyUrl: state => state.config.legal.privacyPolicyUrl,
canWriteCurrentList: state => state.currentList.maxRight > Rights.READ, canWriteCurrentList: state => state.currentList.maxRight > Rights.READ,
}), }),
},
mounted() { mounted() {
this.$nextTick(() => { this.$nextTick(() => {
if (typeof this.$refs.usernameDropdown === 'undefined' || typeof this.$refs.listTitle === 'undefined') { if (typeof this.$refs.usernameDropdown === 'undefined' || typeof this.$refs.listTitle === 'undefined') {

View file

@ -13,7 +13,7 @@
<div class="preview content" v-html="preview" v-if="isPreviewActive && text !== ''"> <div class="preview content" v-html="preview" v-if="isPreviewActive && text !== ''">
</div> </div>
<p class="has-text-centered has-text-grey is-italic" v-if="showPreviewText"> <p class="has-text-centered has-text-grey is-italic my-5" v-if="showPreviewText">
{{ emptyText }} {{ emptyText }}
<template v-if="isEditEnabled"> <template v-if="isEditEnabled">
<a @click="toggleEdit">{{ $t('input.editor.edit') }}</a>. <a @click="toggleEdit">{{ $t('input.editor.edit') }}</a>.
@ -22,20 +22,20 @@
<ul class="actions" v-if="bottomActions.length > 0"> <ul class="actions" v-if="bottomActions.length > 0">
<li v-if="isEditEnabled && !showPreviewText && showSave"> <li v-if="isEditEnabled && !showPreviewText && showSave">
<a v-if="!isEditActive" @click="toggleEdit">{{ $t('input.editor.edit') }}</a> <a v-if="showEditButton" @click="toggleEdit">{{ $t('input.editor.edit') }}</a>
<a v-else @click="toggleEdit" class="done-edit">{{ $t('misc.save') }}</a> <a v-else-if="isEditActive" @click="toggleEdit" class="done-edit">{{ $t('misc.save') }}</a>
</li> </li>
<li v-for="(action, k) in bottomActions" :key="k"> <li v-for="(action, k) in bottomActions" :key="k">
<a @click="action.action">{{ action.title }}</a> <a @click="action.action">{{ action.title }}</a>
</li> </li>
</ul> </ul>
<template v-else-if="isEditEnabled && showSave"> <template v-else-if="isEditEnabled && showSave">
<ul v-if="!isEditActive" class="actions"> <ul v-if="showEditButton" class="actions">
<li> <li>
<a @click="toggleEdit">{{ $t('input.editor.edit') }}</a> <a @click="toggleEdit">{{ $t('input.editor.edit') }}</a>
</li> </li>
</ul> </ul>
<x-button v-else @click="toggleEdit" type="secondary" :shadow="false"> <x-button v-else-if="isEditActive" @click="toggleEdit" type="secondary" :shadow="false">
{{ $t('misc.save') }} {{ $t('misc.save') }}
</x-button> </x-button>
</template> </template>
@ -103,6 +103,9 @@ export default {
showPreviewText() { showPreviewText() {
return this.isPreviewActive && this.text === '' && this.emptyText !== '' return this.isPreviewActive && this.text === '' && this.emptyText !== ''
}, },
showEditButton() {
return !this.isEditActive && this.text !== ''
},
}, },
data() { data() {
return { return {

View file

@ -178,9 +178,8 @@ import Fancycheckbox from '../../input/fancycheckbox'
import flatPickr from 'vue-flatpickr-component' import flatPickr from 'vue-flatpickr-component'
import 'flatpickr/dist/flatpickr.css' import 'flatpickr/dist/flatpickr.css'
import {includesById} from '@/helpers/utils'
import {formatISO} from 'date-fns' import {formatISO} from 'date-fns'
import differenceWith from 'lodash/differenceWith'
import PrioritySelect from '@/components/tasks/partials/prioritySelect.vue' import PrioritySelect from '@/components/tasks/partials/prioritySelect.vue'
import PercentDoneSelect from '@/components/tasks/partials/percentDoneSelect.vue' import PercentDoneSelect from '@/components/tasks/partials/percentDoneSelect.vue'
import Multiselect from '@/components/input/multiselect.vue' import Multiselect from '@/components/input/multiselect.vue'
@ -270,13 +269,7 @@ export default {
}, },
computed: { computed: {
foundLabels() { foundLabels() {
const labels = (Object.values(this.$store.state.labels.labels).filter(l => { return this.$store.getters['labels/filterLabelsByQuery'](this.labels, this.query)
return l.title.toLowerCase().includes(this.labelQuery.toLowerCase())
}) ?? [])
return differenceWith(labels, this.labels, (first, second) => {
return first.id === second.id
})
}, },
flatPickerConfig() { flatPickerConfig() {
return { return {
@ -310,8 +303,13 @@ export default {
this.prepareRelatedObjectFilter('namespace') this.prepareRelatedObjectFilter('namespace')
this.prepareSingleValue('labels') this.prepareSingleValue('labels')
const labelIds = (typeof this.filters.labels === 'string' ? this.filters.labels : '').split(',').map(i => parseInt(i))
this.labels = (Object.values(this.$store.state.labels.labels).filter(l => labelIds.includes(l.id)) ?? []) const labels = typeof this.filters.labels === 'string'
? this.filters.labels
: ''
const labelIds = labels.split(',').map(i => parseInt(i))
this.labels = this.$store.getters['labels/getLabelsByIds'](labelIds)
}, },
removePropertyFromFilter(propertyName) { removePropertyFromFilter(propertyName) {
// Because of the way arrays work, we can only ever remove one element at once. // Because of the way arrays work, we can only ever remove one element at once.
@ -534,10 +532,8 @@ export default {
this[`${kind}Service`].getAll({}, {s: query}) this[`${kind}Service`].getAll({}, {s: query})
.then(response => { .then(response => {
// Filter the results to not include users who are already assigneid // Filter users from the results who are already assigned
this[`found${kind}`] = differenceWith(response, this[kind], (first, second) => { this[`found${kind}`] = response.filter(({id}) => !includesById(this[kind], id))
return first.id === second.id
})
}) })
.catch(e => { .catch(e => {
this.$message.error(e) this.$message.error(e)

View file

@ -34,11 +34,11 @@
class="migration-in-progress-container" class="migration-in-progress-container"
v-else-if="isMigrating === true && message === '' && lastMigrationDate === null"> v-else-if="isMigrating === true && message === '' && lastMigrationDate === null">
<div class="migration-in-progress"> <div class="migration-in-progress">
<img :alt="name" :src="`/images/migration/${identifier}.png`"/> <img :alt="name" :src="serviceIconSource"/>
<div class="progress-dots"> <div class="progress-dots">
<span v-for="i in progressDotsCount" :key="i" /> <span v-for="i in progressDotsCount" :key="i" />
</div> </div>
<img alt="Vikunja" src="/images/logo.svg"> <img alt="Vikunja" :src="logoUrl">
</div> </div>
<p>{{ $t('migrate.inProgress') }}</p> <p>{{ $t('migrate.inProgress') }}</p>
</div> </div>
@ -66,6 +66,9 @@
<script> <script>
import AbstractMigrationService from '../../services/migrator/abstractMigration' import AbstractMigrationService from '../../services/migrator/abstractMigration'
import AbstractMigrationFileService from '../../services/migrator/abstractMigrationFile' import AbstractMigrationFileService from '../../services/migrator/abstractMigrationFile'
import {SERVICE_ICONS} from '../../helpers/migrator'
import logoUrl from '@/assets/logo.svg'
const PROGRESS_DOTS_COUNT = 8 const PROGRESS_DOTS_COUNT = 8
@ -80,6 +83,7 @@ export default {
message: '', message: '',
migratorAuthCode: '', migratorAuthCode: '',
migrationService: null, migrationService: null,
logoUrl,
} }
}, },
props: { props: {
@ -96,6 +100,11 @@ export default {
default: false, default: false,
}, },
}, },
computed: {
serviceIconSource() {
return SERVICE_ICONS[this.identifier]()
},
},
created() { created() {
this.message = '' this.message = ''

View file

@ -102,7 +102,7 @@
> >
{{ t.title }} {{ t.title }}
</span> </span>
<priority-label :priority="t.priority"/> <priority-label :priority="t.priority" :done="t.done"/>
<!-- using the key here forces vue to use the updated version model and not the response returned by the api --> <!-- using the key here forces vue to use the updated version model and not the response returned by the api -->
<a @click="editTask(theTasks[k])" class="edit-toggle"> <a @click="editTask(theTasks[k])" class="edit-toggle">
<icon icon="pen"/> <icon icon="pen"/>
@ -192,7 +192,6 @@ import TaskCollectionService from '../../services/taskCollection'
import {mapState} from 'vuex' import {mapState} from 'vuex'
import Rights from '../../models/constants/rights.json' import Rights from '../../models/constants/rights.json'
import FilterPopup from '@/components/list/partials/filter-popup.vue' import FilterPopup from '@/components/list/partials/filter-popup.vue'
import {format} from 'date-fns'
export default { export default {
name: 'GanttChart', name: 'GanttChart',
@ -466,7 +465,7 @@ export default {
}) })
}, },
formatYear(date) { formatYear(date) {
return format(date, 'MMMM, yyyy') return this.format(date, 'MMMM, yyyy')
}, },
}, },
} }

View file

@ -1,5 +1,4 @@
import TaskCollectionService from '@/services/taskCollection' import TaskCollectionService from '@/services/taskCollection'
import cloneDeep from 'lodash/cloneDeep'
// FIXME: merge with DEFAULT_PARAMS in filters.vue // FIXME: merge with DEFAULT_PARAMS in filters.vue
const DEFAULT_PARAMS = { const DEFAULT_PARAMS = {
@ -83,7 +82,7 @@ export default {
this.tasks = r this.tasks = r
this.currentPage = page this.currentPage = page
this.loadedList = cloneDeep(currentList) this.loadedList = JSON.parse(JSON.stringify(currentList))
}) })
.catch(e => { .catch(e => {
this.$message.error(e) this.$message.error(e)

View file

@ -29,8 +29,7 @@
</template> </template>
<script> <script>
import differenceWith from 'lodash/differenceWith' import {includesById} from '@/helpers/utils'
import UserModel from '../../../models/user' import UserModel from '../../../models/user'
import ListUserService from '../../../services/listUsers' import ListUserService from '../../../services/listUsers'
import TaskAssigneeService from '../../../services/taskAssignee' import TaskAssigneeService from '../../../services/taskAssignee'
@ -112,9 +111,7 @@ export default {
this.listUserService.getAll({listId: this.listId}, {s: query}) this.listUserService.getAll({listId: this.listId}, {s: query})
.then(response => { .then(response => {
// Filter the results to not include users who are already assigned // Filter the results to not include users who are already assigned
this.foundUsers = differenceWith(response, this.assignees, (first, second) => { this.foundUsers = response.filter(({id}) => !includesById(this.assignees, id))
return first.id === second.id
})
}) })
.catch(e => { .catch(e => {
this.$message.error(e) this.$message.error(e)

View file

@ -38,8 +38,6 @@
</template> </template>
<script> <script>
import differenceWith from 'lodash/differenceWith'
import LabelModel from '../../../models/label' import LabelModel from '../../../models/label'
import LabelTaskService from '../../../services/labelTask' import LabelTaskService from '../../../services/labelTask'
@ -84,13 +82,7 @@ export default {
}, },
computed: { computed: {
foundLabels() { foundLabels() {
const labels = (Object.values(this.$store.state.labels.labels).filter(l => { return this.$store.getters['labels/filterLabelsByQuery'](this.labels, this.query)
return l.title.toLowerCase().includes(this.query.toLowerCase())
}) ?? [])
return differenceWith(labels, this.labels, (first, second) => {
return first.id === second.id
})
}, },
loading() { loading() {
return this.labelTaskService.loading || (this.$store.state[LOADING] && this.$store.state[LOADING_MODULE] === 'labels') return this.labelTaskService.loading || (this.$store.state[LOADING] && this.$store.state[LOADING_MODULE] === 'labels')
@ -157,7 +149,7 @@ export default {
.then(r => { .then(r => {
this.addLabel(r, false) this.addLabel(r, false)
this.labels.push(r) this.labels.push(r)
this.$message.success({message: this.$t('task.label.removeSuccess')}) this.$message.success({message: this.$t('task.label.addCreateSuccess')})
}) })
.catch(e => { .catch(e => {
this.$message.error(e) this.$message.error(e)

View file

@ -41,7 +41,7 @@
</progress> </progress>
<div class="footer"> <div class="footer">
<labels :labels="task.labels"/> <labels :labels="task.labels"/>
<priority-label :priority="task.priority"/> <priority-label :priority="task.priority" :done="task.done"/>
<div class="assignees" v-if="task.assignees.length > 0"> <div class="assignees" v-if="task.assignees.length > 0">
<user <user
:avatar-size="24" :avatar-size="24"
@ -51,6 +51,7 @@
v-for="u in task.assignees" v-for="u in task.assignees"
/> />
</div> </div>
<checklist-summary :task="task"/>
<span class="icon" v-if="task.attachments.length > 0"> <span class="icon" v-if="task.attachments.length > 0">
<icon icon="paperclip"/> <icon icon="paperclip"/>
</span> </span>
@ -66,10 +67,12 @@ import {playPop} from '../../../helpers/playPop'
import PriorityLabel from '../../../components/tasks/partials/priorityLabel' import PriorityLabel from '../../../components/tasks/partials/priorityLabel'
import User from '../../../components/misc/user' import User from '../../../components/misc/user'
import Labels from '../../../components/tasks/partials/labels' import Labels from '../../../components/tasks/partials/labels'
import ChecklistSummary from './checklist-summary'
export default { export default {
name: 'kanban-card', name: 'kanban-card',
components: { components: {
ChecklistSummary,
PriorityLabel, PriorityLabel,
User, User,
Labels, Labels,

View file

@ -2,7 +2,7 @@
<span <span
:class="{'not-so-high': priority === priorities.HIGH, 'high-priority': priority >= priorities.HIGH}" :class="{'not-so-high': priority === priorities.HIGH, 'high-priority': priority >= priorities.HIGH}"
class="priority-label" class="priority-label"
v-if="showAll || priority >= priorities.HIGH"> v-if="!done && (showAll || priority >= priorities.HIGH)">
<span class="icon" v-if="priority >= priorities.HIGH"> <span class="icon" v-if="priority >= priorities.HIGH">
<icon icon="exclamation"/> <icon icon="exclamation"/>
</span> </span>
@ -39,6 +39,10 @@ export default {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
done: {
type: Boolean,
default: false,
},
}, },
} }
</script> </script>

View file

@ -56,9 +56,9 @@
<div class="control is-expanded"> <div class="control is-expanded">
<div class="select is-fullwidth has-defaults"> <div class="select is-fullwidth has-defaults">
<select v-model="newTaskRelationKind"> <select v-model="newTaskRelationKind">
<option value="unset">Select a relation kind</option> <option value="unset">{{ $t('task.relation.select') }}</option>
<option :key="rk" :value="rk" v-for="(label, rk) in relationKinds"> <option :key="rk" :value="rk" v-for="rk in relationKinds">
{{ label[0] }} {{ $tc(`task.relation.kinds.${rk}`, 1) }}
</option> </option>
</select> </select>
</div> </div>
@ -256,10 +256,7 @@ export default {
}) })
}, },
relationKindTitle(kind, length) { relationKindTitle(kind, length) {
if (length > 1) { return this.$tc(`task.relation.kinds.${kind}`, length)
return relationKinds[kind][1]
}
return relationKinds[kind][0]
}, },
}, },
} }

View file

@ -50,7 +50,7 @@
<transition name="fade"> <transition name="fade">
<defer-task v-if="+new Date(task.dueDate) > 0 && showDefer" v-model="task" ref="deferDueDate"/> <defer-task v-if="+new Date(task.dueDate) > 0 && showDefer" v-model="task" ref="deferDueDate"/>
</transition> </transition>
<priority-label :priority="task.priority"/> <priority-label :priority="task.priority" :done="task.done"/>
<span> <span>
<span class="list-task-icon" v-if="task.attachments.length > 0"> <span class="list-task-icon" v-if="task.attachments.length > 0">
<icon icon="paperclip"/> <icon icon="paperclip"/>

View file

@ -1,7 +0,0 @@
export function findIndexById(array : [], id : string | number) {
return array.findIndex(({id: currentId}) => currentId === id)
}
export function findById(array : [], id : string | number) {
return array.find(({id: currentId}) => currentId === id)
}

View file

@ -36,3 +36,13 @@ export const getMigratorFromSlug = (slug: string): Migrator => {
throw Error('Unknown migrator slug ' + slug) throw Error('Unknown migrator slug ' + slug)
} }
} }
// NOTE: we list the imports individually for better build time optimisation
export const SERVICE_ICONS = {
'vikunja-file': () => import('@/assets/migration/vikunja-file.png'),
'microsoft-todo': () => import('@/assets/migration/microsoft-todo.svg'),
'todoist': () => import('@/assets/migration/todoist.svg'),
'trello': () => import('@/assets/migration/trello.svg'),
'wunderlist': () => import('@/assets/migration/wunderlist.jpg'),
}

View file

@ -6,6 +6,6 @@ export const playPop = () => {
return return
} }
const popSound = new Audio('/audio/pop.wav') const popSound = new Audio('/audio/pop.mp3')
popSound.play() popSound.play()
} }

View file

@ -1,5 +1,5 @@
import {createDateFromString} from '@/helpers/time/createDateFromString' import {createDateFromString} from '@/helpers/time/createDateFromString'
import {format, formatDistance} from 'date-fns' import {format, formatDistanceToNow} from 'date-fns'
import {enGB, de, fr, ru} from 'date-fns/locale' import {enGB, de, fr, ru} from 'date-fns/locale'
import {i18n} from '@/i18n' import {i18n} from '@/i18n'
@ -39,12 +39,8 @@ export const formatDateSince = (date) => {
date = createDateFromString(date) date = createDateFromString(date)
const currentDate = new Date() return formatDistanceToNow(date, {
const distance = formatDistance(date, currentDate, {locale: locales[i18n.global.t('date.locale')]}) locale: locales[i18n.global.t('date.locale')],
addSuffix: true,
if (date > currentDate) { })
return i18n.global.t('date.in', {date: distance})
}
return i18n.global.t('date.ago', {date: distance})
} }

26
src/helpers/utils.ts Normal file
View file

@ -0,0 +1,26 @@
export function findIndexById(array : [], id : string | number) {
return array.findIndex(({id: currentId}) => currentId === id)
}
export function findById(array : [], id : string | number) {
return array.find(({id: currentId}) => currentId === id)
}
export function includesById(array: [], id: string | number) {
return array.some(({id: currentId}) => currentId === id)
}
// https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_isnil
export function isNil(value: any) {
return value == null
}
export function omitBy(obj: {}, check: (value: any) => Boolean): {} {
if (isNil(obj)) {
return {}
}
return Object.fromEntries(
Object.entries(obj).filter(([, value]) => !check(value)),
)
}

View file

@ -72,7 +72,7 @@
"totp": { "totp": {
"title": "Zwei-Faktor-Authentifizierung", "title": "Zwei-Faktor-Authentifizierung",
"enroll": "Aktivieren", "enroll": "Aktivieren",
"finishSetupPart1": "Um die Aktivierung zu vollenden, benutze diesen Token in deiner TOTP App (sowie OTP oder ähnlich):", "finishSetupPart1": "Um die Aktivierung zu vollenden, benutze diesen Token in deiner TOTP App (Google Authenticator oder ähnlich):",
"finishSetupPart2": "Gib anschließend unten einen Code aus deiner Anwendung ein.", "finishSetupPart2": "Gib anschließend unten einen Code aus deiner Anwendung ein.",
"scanQR": "Alternativ kannst du auch diesen QR-Code scannen:", "scanQR": "Alternativ kannst du auch diesen QR-Code scannen:",
"passcode": "Code", "passcode": "Code",
@ -625,7 +625,8 @@
"createPlaceholder": "Dies als neues Label hinzufügen", "createPlaceholder": "Dies als neues Label hinzufügen",
"addSuccess": "Das Label wurde erfolgreich hinzugefügt.", "addSuccess": "Das Label wurde erfolgreich hinzugefügt.",
"createSuccess": "Das Label wurde erfolgreich erstellt.", "createSuccess": "Das Label wurde erfolgreich erstellt.",
"removeSuccess": "Das Label wurde erfolgreich entfernt." "removeSuccess": "Das Label wurde erfolgreich entfernt.",
"addCreateSuccess": "The label has been created and added successfully."
}, },
"priority": { "priority": {
"unset": "Nicht eingestellt", "unset": "Nicht eingestellt",
@ -644,7 +645,21 @@
"noneYet": "Keine Aufgabenbeziehung vorhanden.", "noneYet": "Keine Aufgabenbeziehung vorhanden.",
"delete": "Aufgabenbeziehung entfernen", "delete": "Aufgabenbeziehung entfernen",
"deleteText1": "Willst du diese Aufgabenbeziehung wirklich entfernen?", "deleteText1": "Willst du diese Aufgabenbeziehung wirklich entfernen?",
"deleteText2": "Dies kann nicht rückgängig gemacht werden!" "deleteText2": "Dies kann nicht rückgängig gemacht werden!",
"select": "Select a relation kind",
"kinds": {
"subtask": "Subtask | Subtasks",
"parenttask": "Parent Task | Parent Tasks",
"related": "Related Task | Related Tasks",
"duplicateof": "Duplicate Of | Duplicates Of",
"duplicates": "Duplicates | Duplicates",
"blocking": "Blocking | Blocking",
"blocked": "Blocked By | Blocked By",
"precedes": "Precedes | Precedes",
"follows": "Follows | Follows",
"copiedfrom": "Copied From | Copied From",
"copiedto": "Copied To | Copied To"
}
}, },
"repeat": { "repeat": {
"everyDay": "Jeden Tag", "everyDay": "Jeden Tag",
@ -795,8 +810,6 @@
}, },
"date": { "date": {
"locale": "de", "locale": "de",
"in": "in {date}",
"ago": "vor {date}",
"altFormatLong": "j M Y H:i", "altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y" "altFormatShort": "j M Y"
}, },

View file

@ -625,7 +625,8 @@
"createPlaceholder": "Das als neues Label hinzuefüege", "createPlaceholder": "Das als neues Label hinzuefüege",
"addSuccess": "Das Label isch erfolgriich hinzuegfüegt worde.", "addSuccess": "Das Label isch erfolgriich hinzuegfüegt worde.",
"createSuccess": "Das Label isch erfolgriich erstellt worde.", "createSuccess": "Das Label isch erfolgriich erstellt worde.",
"removeSuccess": "Das Label isch erfolgriich glöscht." "removeSuccess": "Das Label isch erfolgriich glöscht.",
"addCreateSuccess": "The label has been created and added successfully."
}, },
"priority": { "priority": {
"unset": "Nid iihgstellt", "unset": "Nid iihgstellt",
@ -644,7 +645,21 @@
"noneYet": "S'git kei Uufgabe Beziehige.", "noneYet": "S'git kei Uufgabe Beziehige.",
"delete": "Uufgabe Beziehig chüble", "delete": "Uufgabe Beziehig chüble",
"deleteText1": "Bisch du dir sicher, dass du die Zueghörigkeit chüblä wetsch?", "deleteText1": "Bisch du dir sicher, dass du die Zueghörigkeit chüblä wetsch?",
"deleteText2": "Das chan nid rückgängig gmacht werde!" "deleteText2": "Das chan nid rückgängig gmacht werde!",
"select": "Select a relation kind",
"kinds": {
"subtask": "Subtask | Subtasks",
"parenttask": "Parent Task | Parent Tasks",
"related": "Related Task | Related Tasks",
"duplicateof": "Duplicate Of | Duplicates Of",
"duplicates": "Duplicates | Duplicates",
"blocking": "Blocking | Blocking",
"blocked": "Blocked By | Blocked By",
"precedes": "Precedes | Precedes",
"follows": "Follows | Follows",
"copiedfrom": "Copied From | Copied From",
"copiedto": "Copied To | Copied To"
}
}, },
"repeat": { "repeat": {
"everyDay": "Jedä Tag", "everyDay": "Jedä Tag",
@ -795,8 +810,6 @@
}, },
"date": { "date": {
"locale": "ch", "locale": "ch",
"in": "in {date}",
"ago": "vor {date}",
"altFormatLong": "j M Y H:i", "altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y" "altFormatShort": "j M Y"
}, },

View file

@ -625,7 +625,8 @@
"createPlaceholder": "Add this as new label", "createPlaceholder": "Add this as new label",
"addSuccess": "The label has been added successfully.", "addSuccess": "The label has been added successfully.",
"createSuccess": "The label has been created successfully.", "createSuccess": "The label has been created successfully.",
"removeSuccess": "The label has been removed successfully." "removeSuccess": "The label has been removed successfully.",
"addCreateSuccess": "The label has been created and added successfully."
}, },
"priority": { "priority": {
"unset": "Unset", "unset": "Unset",
@ -644,7 +645,21 @@
"noneYet": "No task relations yet.", "noneYet": "No task relations yet.",
"delete": "Delete Task Relation", "delete": "Delete Task Relation",
"deleteText1": "Are you sure you want to delete this task relation?", "deleteText1": "Are you sure you want to delete this task relation?",
"deleteText2": "This cannot be undone!" "deleteText2": "This cannot be undone!",
"select": "Select a relation kind",
"kinds": {
"subtask": "Subtask | Subtasks",
"parenttask": "Parent Task | Parent Tasks",
"related": "Related Task | Related Tasks",
"duplicateof": "Duplicate Of | Duplicates Of",
"duplicates": "Duplicates | Duplicates",
"blocking": "Blocking | Blocking",
"blocked": "Blocked By | Blocked By",
"precedes": "Precedes | Precedes",
"follows": "Follows | Follows",
"copiedfrom": "Copied From | Copied From",
"copiedto": "Copied To | Copied To"
}
}, },
"repeat": { "repeat": {
"everyDay": "Every Day", "everyDay": "Every Day",
@ -795,8 +810,6 @@
}, },
"date": { "date": {
"locale": "en", "locale": "en",
"in": "in {date}",
"ago": "{date} ago",
"altFormatLong": "j M Y H:i", "altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y" "altFormatShort": "j M Y"
}, },

View file

@ -625,7 +625,8 @@
"createPlaceholder": "Add this as new label", "createPlaceholder": "Add this as new label",
"addSuccess": "The label has been added successfully.", "addSuccess": "The label has been added successfully.",
"createSuccess": "The label has been created successfully.", "createSuccess": "The label has been created successfully.",
"removeSuccess": "The label has been removed successfully." "removeSuccess": "The label has been removed successfully.",
"addCreateSuccess": "The label has been created and added successfully."
}, },
"priority": { "priority": {
"unset": "Unset", "unset": "Unset",
@ -644,7 +645,21 @@
"noneYet": "No task relations yet.", "noneYet": "No task relations yet.",
"delete": "Delete Task Relation", "delete": "Delete Task Relation",
"deleteText1": "Are you sure you want to delete this task relation?", "deleteText1": "Are you sure you want to delete this task relation?",
"deleteText2": "This cannot be undone!" "deleteText2": "This cannot be undone!",
"select": "Select a relation kind",
"kinds": {
"subtask": "Subtask | Subtasks",
"parenttask": "Parent Task | Parent Tasks",
"related": "Related Task | Related Tasks",
"duplicateof": "Duplicate Of | Duplicates Of",
"duplicates": "Duplicates | Duplicates",
"blocking": "Blocking | Blocking",
"blocked": "Blocked By | Blocked By",
"precedes": "Precedes | Precedes",
"follows": "Follows | Follows",
"copiedfrom": "Copied From | Copied From",
"copiedto": "Copied To | Copied To"
}
}, },
"repeat": { "repeat": {
"everyDay": "Every Day", "everyDay": "Every Day",
@ -795,8 +810,6 @@
}, },
"date": { "date": {
"locale": "en", "locale": "en",
"in": "in {date}",
"ago": "{date} ago",
"altFormatLong": "j M Y H:i", "altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y" "altFormatShort": "j M Y"
}, },

View file

@ -625,7 +625,8 @@
"createPlaceholder": "Ajouter ceci comme nouvelle étiquette", "createPlaceholder": "Ajouter ceci comme nouvelle étiquette",
"addSuccess": "Étiquette ajoutée.", "addSuccess": "Étiquette ajoutée.",
"createSuccess": "Étiquette créée.", "createSuccess": "Étiquette créée.",
"removeSuccess": "Étiquette retirée." "removeSuccess": "Étiquette retirée.",
"addCreateSuccess": "The label has been created and added successfully."
}, },
"priority": { "priority": {
"unset": "Non définie", "unset": "Non définie",
@ -644,7 +645,21 @@
"noneYet": "Pas encore de relations de tâches.", "noneYet": "Pas encore de relations de tâches.",
"delete": "Supprimer la relation de tâche", "delete": "Supprimer la relation de tâche",
"deleteText1": "Supprimer cette relation de tâche ?", "deleteText1": "Supprimer cette relation de tâche ?",
"deleteText2": "Ceci ne peut pas être annulé !" "deleteText2": "Ceci ne peut pas être annulé !",
"select": "Select a relation kind",
"kinds": {
"subtask": "Subtask | Subtasks",
"parenttask": "Parent Task | Parent Tasks",
"related": "Related Task | Related Tasks",
"duplicateof": "Duplicate Of | Duplicates Of",
"duplicates": "Duplicates | Duplicates",
"blocking": "Blocking | Blocking",
"blocked": "Blocked By | Blocked By",
"precedes": "Precedes | Precedes",
"follows": "Follows | Follows",
"copiedfrom": "Copied From | Copied From",
"copiedto": "Copied To | Copied To"
}
}, },
"repeat": { "repeat": {
"everyDay": "Chaque jour", "everyDay": "Chaque jour",
@ -795,8 +810,6 @@
}, },
"date": { "date": {
"locale": "fr", "locale": "fr",
"in": "en {date}",
"ago": "il y a {date}",
"altFormatLong": "j M Y H:i", "altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y" "altFormatShort": "j M Y"
}, },

View file

@ -625,7 +625,8 @@
"createPlaceholder": "Add this as new label", "createPlaceholder": "Add this as new label",
"addSuccess": "The label has been added successfully.", "addSuccess": "The label has been added successfully.",
"createSuccess": "The label has been created successfully.", "createSuccess": "The label has been created successfully.",
"removeSuccess": "The label has been removed successfully." "removeSuccess": "The label has been removed successfully.",
"addCreateSuccess": "The label has been created and added successfully."
}, },
"priority": { "priority": {
"unset": "Unset", "unset": "Unset",
@ -644,7 +645,21 @@
"noneYet": "No task relations yet.", "noneYet": "No task relations yet.",
"delete": "Delete Task Relation", "delete": "Delete Task Relation",
"deleteText1": "Are you sure you want to delete this task relation?", "deleteText1": "Are you sure you want to delete this task relation?",
"deleteText2": "This cannot be undone!" "deleteText2": "This cannot be undone!",
"select": "Select a relation kind",
"kinds": {
"subtask": "Subtask | Subtasks",
"parenttask": "Parent Task | Parent Tasks",
"related": "Related Task | Related Tasks",
"duplicateof": "Duplicate Of | Duplicates Of",
"duplicates": "Duplicates | Duplicates",
"blocking": "Blocking | Blocking",
"blocked": "Blocked By | Blocked By",
"precedes": "Precedes | Precedes",
"follows": "Follows | Follows",
"copiedfrom": "Copied From | Copied From",
"copiedto": "Copied To | Copied To"
}
}, },
"repeat": { "repeat": {
"everyDay": "Every Day", "everyDay": "Every Day",
@ -795,8 +810,6 @@
}, },
"date": { "date": {
"locale": "en", "locale": "en",
"in": "in {date}",
"ago": "{date} ago",
"altFormatLong": "j M Y H:i", "altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y" "altFormatShort": "j M Y"
}, },

View file

@ -625,7 +625,8 @@
"createPlaceholder": "Add this as new label", "createPlaceholder": "Add this as new label",
"addSuccess": "The label has been added successfully.", "addSuccess": "The label has been added successfully.",
"createSuccess": "The label has been created successfully.", "createSuccess": "The label has been created successfully.",
"removeSuccess": "The label has been removed successfully." "removeSuccess": "The label has been removed successfully.",
"addCreateSuccess": "The label has been created and added successfully."
}, },
"priority": { "priority": {
"unset": "Unset", "unset": "Unset",
@ -644,7 +645,21 @@
"noneYet": "No task relations yet.", "noneYet": "No task relations yet.",
"delete": "Delete Task Relation", "delete": "Delete Task Relation",
"deleteText1": "Are you sure you want to delete this task relation?", "deleteText1": "Are you sure you want to delete this task relation?",
"deleteText2": "This cannot be undone!" "deleteText2": "This cannot be undone!",
"select": "Select a relation kind",
"kinds": {
"subtask": "Subtask | Subtasks",
"parenttask": "Parent Task | Parent Tasks",
"related": "Related Task | Related Tasks",
"duplicateof": "Duplicate Of | Duplicates Of",
"duplicates": "Duplicates | Duplicates",
"blocking": "Blocking | Blocking",
"blocked": "Blocked By | Blocked By",
"precedes": "Precedes | Precedes",
"follows": "Follows | Follows",
"copiedfrom": "Copied From | Copied From",
"copiedto": "Copied To | Copied To"
}
}, },
"repeat": { "repeat": {
"everyDay": "Every Day", "everyDay": "Every Day",
@ -795,8 +810,6 @@
}, },
"date": { "date": {
"locale": "en", "locale": "en",
"in": "in {date}",
"ago": "{date} ago",
"altFormatLong": "j M Y H:i", "altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y" "altFormatShort": "j M Y"
}, },

View file

@ -625,7 +625,8 @@
"createPlaceholder": "Add this as new label", "createPlaceholder": "Add this as new label",
"addSuccess": "The label has been added successfully.", "addSuccess": "The label has been added successfully.",
"createSuccess": "The label has been created successfully.", "createSuccess": "The label has been created successfully.",
"removeSuccess": "The label has been removed successfully." "removeSuccess": "The label has been removed successfully.",
"addCreateSuccess": "The label has been created and added successfully."
}, },
"priority": { "priority": {
"unset": "Unset", "unset": "Unset",
@ -644,7 +645,21 @@
"noneYet": "No task relations yet.", "noneYet": "No task relations yet.",
"delete": "Delete Task Relation", "delete": "Delete Task Relation",
"deleteText1": "Are you sure you want to delete this task relation?", "deleteText1": "Are you sure you want to delete this task relation?",
"deleteText2": "This cannot be undone!" "deleteText2": "This cannot be undone!",
"select": "Select a relation kind",
"kinds": {
"subtask": "Subtask | Subtasks",
"parenttask": "Parent Task | Parent Tasks",
"related": "Related Task | Related Tasks",
"duplicateof": "Duplicate Of | Duplicates Of",
"duplicates": "Duplicates | Duplicates",
"blocking": "Blocking | Blocking",
"blocked": "Blocked By | Blocked By",
"precedes": "Precedes | Precedes",
"follows": "Follows | Follows",
"copiedfrom": "Copied From | Copied From",
"copiedto": "Copied To | Copied To"
}
}, },
"repeat": { "repeat": {
"everyDay": "Every Day", "everyDay": "Every Day",
@ -795,8 +810,6 @@
}, },
"date": { "date": {
"locale": "en", "locale": "en",
"in": "in {date}",
"ago": "{date} ago",
"altFormatLong": "j M Y H:i", "altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y" "altFormatShort": "j M Y"
}, },

View file

@ -625,7 +625,8 @@
"createPlaceholder": "Add this as new label", "createPlaceholder": "Add this as new label",
"addSuccess": "The label has been added successfully.", "addSuccess": "The label has been added successfully.",
"createSuccess": "The label has been created successfully.", "createSuccess": "The label has been created successfully.",
"removeSuccess": "The label has been removed successfully." "removeSuccess": "The label has been removed successfully.",
"addCreateSuccess": "The label has been created and added successfully."
}, },
"priority": { "priority": {
"unset": "Unset", "unset": "Unset",
@ -644,7 +645,21 @@
"noneYet": "No task relations yet.", "noneYet": "No task relations yet.",
"delete": "Delete Task Relation", "delete": "Delete Task Relation",
"deleteText1": "Are you sure you want to delete this task relation?", "deleteText1": "Are you sure you want to delete this task relation?",
"deleteText2": "This cannot be undone!" "deleteText2": "This cannot be undone!",
"select": "Select a relation kind",
"kinds": {
"subtask": "Subtask | Subtasks",
"parenttask": "Parent Task | Parent Tasks",
"related": "Related Task | Related Tasks",
"duplicateof": "Duplicate Of | Duplicates Of",
"duplicates": "Duplicates | Duplicates",
"blocking": "Blocking | Blocking",
"blocked": "Blocked By | Blocked By",
"precedes": "Precedes | Precedes",
"follows": "Follows | Follows",
"copiedfrom": "Copied From | Copied From",
"copiedto": "Copied To | Copied To"
}
}, },
"repeat": { "repeat": {
"everyDay": "Every Day", "everyDay": "Every Day",
@ -795,8 +810,6 @@
}, },
"date": { "date": {
"locale": "en", "locale": "en",
"in": "in {date}",
"ago": "{date} ago",
"altFormatLong": "j M Y H:i", "altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y" "altFormatShort": "j M Y"
}, },

View file

@ -625,7 +625,8 @@
"createPlaceholder": "Add this as new label", "createPlaceholder": "Add this as new label",
"addSuccess": "The label has been added successfully.", "addSuccess": "The label has been added successfully.",
"createSuccess": "The label has been created successfully.", "createSuccess": "The label has been created successfully.",
"removeSuccess": "The label has been removed successfully." "removeSuccess": "The label has been removed successfully.",
"addCreateSuccess": "The label has been created and added successfully."
}, },
"priority": { "priority": {
"unset": "Unset", "unset": "Unset",
@ -644,7 +645,21 @@
"noneYet": "No task relations yet.", "noneYet": "No task relations yet.",
"delete": "Delete Task Relation", "delete": "Delete Task Relation",
"deleteText1": "Are you sure you want to delete this task relation?", "deleteText1": "Are you sure you want to delete this task relation?",
"deleteText2": "This cannot be undone!" "deleteText2": "This cannot be undone!",
"select": "Select a relation kind",
"kinds": {
"subtask": "Subtask | Subtasks",
"parenttask": "Parent Task | Parent Tasks",
"related": "Related Task | Related Tasks",
"duplicateof": "Duplicate Of | Duplicates Of",
"duplicates": "Duplicates | Duplicates",
"blocking": "Blocking | Blocking",
"blocked": "Blocked By | Blocked By",
"precedes": "Precedes | Precedes",
"follows": "Follows | Follows",
"copiedfrom": "Copied From | Copied From",
"copiedto": "Copied To | Copied To"
}
}, },
"repeat": { "repeat": {
"everyDay": "Every Day", "everyDay": "Every Day",
@ -795,8 +810,6 @@
}, },
"date": { "date": {
"locale": "en", "locale": "en",
"in": "in {date}",
"ago": "{date} ago",
"altFormatLong": "j M Y H:i", "altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y" "altFormatShort": "j M Y"
}, },

View file

@ -625,7 +625,8 @@
"createPlaceholder": "Добавить как новую метку", "createPlaceholder": "Добавить как новую метку",
"addSuccess": "Метка добавлена.", "addSuccess": "Метка добавлена.",
"createSuccess": "Метка создана.", "createSuccess": "Метка создана.",
"removeSuccess": "Метка удалена." "removeSuccess": "Метка удалена.",
"addCreateSuccess": "The label has been created and added successfully."
}, },
"priority": { "priority": {
"unset": "Не указан", "unset": "Не указан",
@ -644,7 +645,21 @@
"noneYet": "Ещё нет связанных задач.", "noneYet": "Ещё нет связанных задач.",
"delete": "Удалить связь", "delete": "Удалить связь",
"deleteText1": "Удалить эту связь с задачей?", "deleteText1": "Удалить эту связь с задачей?",
"deleteText2": "Это действие отменить нельзя!" "deleteText2": "Это действие отменить нельзя!",
"select": "Select a relation kind",
"kinds": {
"subtask": "Subtask | Subtasks",
"parenttask": "Parent Task | Parent Tasks",
"related": "Related Task | Related Tasks",
"duplicateof": "Duplicate Of | Duplicates Of",
"duplicates": "Duplicates | Duplicates",
"blocking": "Blocking | Blocking",
"blocked": "Blocked By | Blocked By",
"precedes": "Precedes | Precedes",
"follows": "Follows | Follows",
"copiedfrom": "Copied From | Copied From",
"copiedto": "Copied To | Copied To"
}
}, },
"repeat": { "repeat": {
"everyDay": "Каждый день", "everyDay": "Каждый день",
@ -795,8 +810,6 @@
}, },
"date": { "date": {
"locale": "en", "locale": "en",
"in": "в {date}",
"ago": "{date} назад",
"altFormatLong": "j M Y H:i", "altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y" "altFormatShort": "j M Y"
}, },

View file

@ -18,7 +18,7 @@ declare global {
} }
} }
import {formatDateShort, formatDateLong, formatDateSince} from '@/helpers/time/formatDate' import {formatDate, formatDateShort, formatDateLong, formatDateSince} from '@/helpers/time/formatDate'
// @ts-ignore // @ts-ignore
import {VERSION} from './version.json' import {VERSION} from './version.json'
@ -82,6 +82,7 @@ import {setTitle} from './helpers/setTitle'
app.mixin({ app.mixin({
methods: { methods: {
formatDateSince, formatDateSince,
format: formatDate,
formatDate: formatDateLong, formatDate: formatDateLong,
formatDateShort: formatDateShort, formatDateShort: formatDateShort,
getNamespaceTitle, getNamespaceTitle,

View file

@ -1,7 +1,5 @@
import defaults from 'lodash/defaults'
import isNil from 'lodash/isNil'
import omitBy from 'lodash/omitBy'
import {objectToCamelCase} from '@/helpers/case' import {objectToCamelCase} from '@/helpers/case'
import {omitBy, isNil} from '@/helpers/utils'
export default class AbstractModel { export default class AbstractModel {
@ -16,11 +14,14 @@ export default class AbstractModel {
* @param data * @param data
*/ */
constructor(data) { constructor(data) {
data = objectToCamelCase(data) data = objectToCamelCase(data)
// Put all data in our model while overriding those with a value of null or undefined with their defaults // Put all data in our model while overriding those with a value of null or undefined with their defaults
defaults(this, omitBy(data, isNil), this.defaults()) Object.assign(
this,
this.defaults(),
omitBy(data, isNil),
)
} }
/** /**

View file

@ -1,46 +1,12 @@
{ [
"subtask": [ "subtask",
"Subtask", "parenttask",
"Subtasks" "related",
], "duplicates",
"parenttask": [ "blocking",
"Parent Task", "blocked",
"Parent Tasks" "precedes",
], "follows",
"related": [ "copiedfrom",
"Related Task", "copiedto"
"Related Tasks"
],
"duplicateof": [
"Duplicate Of",
"Duplicates Of"
],
"duplicates": [
"Duplicates",
"Duplicates"
],
"blocking": [
"Blocking",
"Blocking"
],
"blocked": [
"Blocked By",
"Blocked By"
],
"precedes": [
"Precedes",
"Precedes"
],
"follows": [
"Follows",
"Follows"
],
"copiedfrom": [
"Copied From",
"Copied From"
],
"copiedto": [
"Copied To",
"Copied To"
] ]
}

View file

@ -1,13 +1,10 @@
import TeamShareBaseModel from './teamShareBase' import TeamShareBaseModel from './teamShareBase'
import merge from 'lodash/merge'
export default class TeamListModel extends TeamShareBaseModel { export default class TeamListModel extends TeamShareBaseModel {
defaults() { defaults() {
return merge( return {
super.defaults(), ...super.defaults(),
{
listId: 0, listId: 0,
}, }
)
} }
} }

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