Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb6c96f6c6 | ||
|
|
b4875a839a | ||
|
|
4fa3389232 | ||
|
|
96586ad193 | ||
|
|
6741b1b6eb | ||
|
|
a057523314 | ||
|
|
37e8cba630 | ||
|
|
6828b6a10e | ||
|
|
2501c07bfb | ||
|
|
ecbb16c63e | ||
|
|
cb0c1d90eb | ||
|
|
f29eb76318 | ||
|
|
05aeba483e | ||
|
|
c0651b9927 | ||
|
|
0efa70c5ee | ||
|
|
beb2e1f9f9 | ||
|
|
356e83a6c9 | ||
|
|
47538ca810 | ||
|
|
abae6f05e0 | ||
|
|
45ec1a4c47 | ||
|
|
77d1616fea | ||
|
|
b5cb98498a | ||
|
|
70e027a84e | ||
|
|
289bb73e9e | ||
|
|
8bada3e967 | ||
|
|
1863b06d0c | ||
|
|
d630586f63 | ||
|
|
13002d77f5 | ||
|
|
a61e2d064d | ||
|
|
e1f78462e5 | ||
|
|
8a6f3b34f9 | ||
|
|
e7b261f84e | ||
|
|
94fb88ed58 | ||
|
|
e70fec3ddb | ||
|
|
bb1456e1aa | ||
|
|
1f4d097beb | ||
|
|
e00ce92716 | ||
|
|
b7fc29327a | ||
|
|
abb4126bce | ||
|
|
e9a932e0f0 | ||
|
|
9d985f7e96 | ||
|
|
811a933cd3 | ||
|
|
c118e788b8 | ||
|
|
2522cffa61 | ||
|
|
33b9917c7d | ||
|
|
845fe8ea88 | ||
|
|
5a0cee956e | ||
|
|
173473fb5a | ||
|
|
79071a1909 | ||
|
|
140765ad20 | ||
|
|
000f1adb75 | ||
|
|
0c3ef89d1a | ||
|
|
1ad4ba10a7 | ||
|
|
8ba9ded3e2 | ||
|
|
68896c69cb | ||
|
|
e1bf797709 | ||
|
|
83732ec26d | ||
|
|
23a3f78337 | ||
|
|
d0059d0292 | ||
|
|
b41cf7241a | ||
|
|
f144a0f11e | ||
|
|
8bf6251a70 | ||
|
|
54f9c5c6d4 | ||
|
|
76cb5ff9a4 | ||
|
|
1db99dba47 | ||
|
|
017fa1b5af | ||
|
|
7e66f3ec6b | ||
|
|
748fa2b798 | ||
|
|
304de78c48 | ||
|
|
3d5d17336e | ||
|
|
b181fff729 | ||
|
|
cc4fd97dd8 | ||
|
|
c9a9781bc7 | ||
|
|
ae187d7a14 | ||
|
|
f428c8a017 | ||
|
|
f777a1dcd3 | ||
|
|
9e5994105a | ||
|
|
8cec9995e3 | ||
|
|
466d0a73a9 | ||
|
|
00441ee8b1 | ||
|
|
c92f6c5ee5 | ||
|
|
eab72d4594 | ||
|
|
91e4bad544 | ||
|
|
fbc48c43f5 | ||
|
|
a49c06d408 | ||
|
|
d308583b9e | ||
|
|
2ba9d1c9fe | ||
|
|
13aaece2e0 | ||
|
|
57cb9a3d19 | ||
|
|
746c3359a5 | ||
|
|
6dc2348fbe | ||
|
|
d88295f31f | ||
|
|
42f5cdf2d9 | ||
|
|
b8fd5dde3b | ||
|
|
3d727e6856 | ||
|
|
a6644d9c89 | ||
|
|
c4c8017605 | ||
|
|
6e417d92ae | ||
|
|
d22880b442 | ||
|
|
a8a746e302 | ||
|
|
6ee6b2ffee | ||
|
|
367530bf2d | ||
|
|
40e9b48564 | ||
|
|
af50145705 | ||
|
|
297817d3f8 | ||
|
|
0826d72e38 | ||
|
|
6e55330b6e | ||
|
|
f16cd8d813 | ||
|
|
70f1b4f28b | ||
|
|
2ab172cfeb | ||
|
|
ae87348882 | ||
|
|
ea2215a615 | ||
|
|
064aff56e3 | ||
|
|
63839805df | ||
|
|
aa43f4fa93 | ||
|
|
24e4284e3b | ||
|
|
c97fec9fed | ||
|
|
f520881538 | ||
|
|
bfb7cf9403 | ||
|
|
9c5f35a0d8 | ||
|
|
2185d36d36 | ||
|
|
4afc77488e | ||
|
|
cbee46b403 | ||
|
|
9eb5c62b01 | ||
|
|
1387f1c497 | ||
|
|
f76970b5a3 | ||
|
|
98be0d6f67 | ||
|
|
d046599192 | ||
|
|
e8ca2a9ab8 | ||
|
|
bdc3dae4f3 | ||
|
|
2412d29a40 | ||
|
|
703a88e99f | ||
|
|
336b3448cf | ||
|
|
4359819faf | ||
|
|
3f97414497 | ||
|
|
47ff7d8ad3 | ||
|
|
dc379b7a7e | ||
|
|
6a2a8c106b | ||
|
|
28a58303f0 | ||
|
|
01c84be945 | ||
|
|
b579041185 | ||
|
|
e3260772ca | ||
|
|
a65955b409 | ||
|
|
9a9abe53da | ||
|
|
b3040b8466 | ||
|
|
b3c93ae811 | ||
|
|
a1cf2b8bc7 | ||
|
|
6f9b0ddfe7 | ||
|
|
c9a68d3a63 | ||
|
|
7ac2c42e4d | ||
|
|
5abca0927b | ||
|
|
4512045cbf | ||
|
|
e56a01f42d | ||
|
|
cff602c246 | ||
|
|
13d52c721d | ||
|
|
98c10acb50 | ||
|
|
9b5ee28a69 | ||
|
|
8f5be72104 | ||
|
|
07df606c68 | ||
|
|
e8a07fc8e0 | ||
|
|
a800cbed5f | ||
|
|
2ac11b13a1 | ||
|
|
9aca4ca0f6 | ||
|
|
2c9625b26b | ||
|
|
25fd0f6108 | ||
|
|
942c2e4af6 | ||
|
|
5c93d0c57c | ||
|
|
ed5474a28a | ||
|
|
57e43a9d51 | ||
|
|
3de532ed50 | ||
|
|
84309701d3 | ||
|
|
e02ebbcba1 | ||
|
|
1f55e3f866 | ||
|
|
1563c462a2 | ||
|
|
63732a37c0 | ||
|
|
80f8570e22 | ||
|
|
a325b27051 | ||
|
|
f0ebc3542e | ||
|
|
69b619144d | ||
|
|
01f126bb43 | ||
|
|
a38fafefaa | ||
|
|
8691919d68 | ||
|
|
33f82a6d1f | ||
|
|
075ea98ccd | ||
|
|
4d0ab0ef7f | ||
|
|
5daa1c6808 | ||
|
|
522db23183 | ||
|
|
c52b7efc97 | ||
|
|
f77f03efbe | ||
|
|
f8fe3b7e87 | ||
|
|
90951d4003 | ||
|
|
03eff35245 | ||
|
|
727b69266a | ||
|
|
de1ad619cf | ||
|
|
d8ac7003c6 | ||
|
|
575df84476 | ||
|
|
de6079cc86 | ||
|
|
3dd42555b5 | ||
|
|
8d8406df05 | ||
|
|
e57f04ec23 | ||
|
|
91d603dc9e | ||
|
|
d9215b1a1b | ||
|
|
069cc5144f | ||
|
|
388abe97ce | ||
|
|
e8576577a3 | ||
|
|
f1311b74c6 | ||
|
|
5cbb06c226 | ||
|
|
affa0c465c | ||
|
|
92571d9998 | ||
|
|
a136161478 | ||
|
|
bab96a8686 | ||
|
|
43ad449ebf | ||
|
|
72d3a9ebf8 | ||
|
|
da9f36d568 | ||
|
|
2f78e0e22d | ||
|
|
8dfb34c863 | ||
|
|
ed071e504e | ||
|
|
d9c1f3d51a | ||
|
|
174522e63d | ||
|
|
e8426c0390 | ||
|
|
89f3caaa52 | ||
|
|
28b1bb824a | ||
|
|
eecb96a683 | ||
|
|
ee04423c4c | ||
|
|
5edccba028 | ||
|
|
8732837596 | ||
|
|
85823b3e97 | ||
|
|
3c13d3b635 | ||
|
|
3659b7b58d | ||
|
|
bbbd936868 | ||
|
|
80219c34b9 | ||
|
|
0124d10391 | ||
|
|
675985b26c | ||
|
|
a5cc5e3783 | ||
|
|
e124ad4df9 | ||
|
|
26f02d2e6a | ||
|
|
42e01637ef | ||
|
|
0af1accbb4 | ||
|
|
6bba2b2dc3 | ||
|
|
7a10a49c5c | ||
|
|
f2eac4623d | ||
|
|
a58c5de657 | ||
|
|
0b9fd2c485 | ||
|
|
940b450a56 | ||
|
|
d616bab76d | ||
|
|
92c58ab32f | ||
|
|
624907ad6a | ||
|
|
f9a6b4f1bb | ||
|
|
394c9432a8 | ||
|
|
3bafaa7101 |
@@ -363,7 +363,7 @@ steps:
|
||||
- api-build
|
||||
|
||||
- name: frontend-dependencies
|
||||
image: node:22.11.0-alpine
|
||||
image: node:22.13.0-alpine
|
||||
pull: always
|
||||
environment:
|
||||
PNPM_CACHE_FOLDER: .cache/pnpm
|
||||
@@ -377,7 +377,7 @@ steps:
|
||||
# - restore-cache
|
||||
|
||||
- name: frontend-lint
|
||||
image: node:22.11.0-alpine
|
||||
image: node:22.13.0-alpine
|
||||
pull: always
|
||||
environment:
|
||||
PNPM_CACHE_FOLDER: .cache/pnpm
|
||||
@@ -389,7 +389,7 @@ steps:
|
||||
- frontend-dependencies
|
||||
|
||||
- name: frontend-build-prod
|
||||
image: node:22.11.0-alpine
|
||||
image: node:22.13.0-alpine
|
||||
pull: always
|
||||
environment:
|
||||
PNPM_CACHE_FOLDER: .cache/pnpm
|
||||
@@ -401,7 +401,7 @@ steps:
|
||||
- frontend-dependencies
|
||||
|
||||
- name: frontend-test-unit
|
||||
image: node:22.11.0-alpine
|
||||
image: node:22.13.0-alpine
|
||||
pull: always
|
||||
commands:
|
||||
- cd frontend
|
||||
@@ -412,7 +412,7 @@ steps:
|
||||
|
||||
- name: frontend-typecheck
|
||||
failure: ignore
|
||||
image: node:22.11.0-alpine
|
||||
image: node:22.13.0-alpine
|
||||
pull: always
|
||||
environment:
|
||||
PNPM_CACHE_FOLDER: .cache/pnpm
|
||||
@@ -543,7 +543,7 @@ steps:
|
||||
- git fetch --tags
|
||||
|
||||
- name: frontend-dependencies
|
||||
image: node:22.11.0-alpine
|
||||
image: node:22.13.0-alpine
|
||||
pull: always
|
||||
environment:
|
||||
PNPM_CACHE_FOLDER: .cache/pnpm
|
||||
@@ -555,7 +555,7 @@ steps:
|
||||
- pnpm install --fetch-timeout 100000
|
||||
|
||||
- name: frontend-build
|
||||
image: node:22.11.0-alpine
|
||||
image: node:22.13.0-alpine
|
||||
pull: always
|
||||
environment:
|
||||
PNPM_CACHE_FOLDER: .cache/pnpm
|
||||
@@ -763,7 +763,7 @@ steps:
|
||||
|
||||
# Build os packages and push it to our bucket
|
||||
- name: build-os-packages-unstable
|
||||
image: goreleaser/nfpm:v2.41.0
|
||||
image: goreleaser/nfpm:v2.41.2
|
||||
pull: always
|
||||
commands:
|
||||
- apk add git go
|
||||
@@ -779,7 +779,7 @@ steps:
|
||||
depends_on: [ after-build-compress ]
|
||||
|
||||
- name: build-os-packages-version
|
||||
image: goreleaser/nfpm:v2.41.0
|
||||
image: goreleaser/nfpm:v2.41.2
|
||||
pull: always
|
||||
commands:
|
||||
- apk add git go
|
||||
@@ -946,7 +946,7 @@ steps:
|
||||
- git fetch --tags
|
||||
|
||||
- name: build
|
||||
image: node:22.11.0-alpine
|
||||
image: node:22.13.0-alpine
|
||||
pull: always
|
||||
environment:
|
||||
PNPM_CACHE_FOLDER: .cache/pnpm
|
||||
@@ -1007,7 +1007,7 @@ steps:
|
||||
- git fetch --tags
|
||||
|
||||
- name: build
|
||||
image: node:22.11.0-alpine
|
||||
image: node:22.13.0-alpine
|
||||
pull: always
|
||||
environment:
|
||||
PNPM_CACHE_FOLDER: .cache/pnpm
|
||||
@@ -1398,6 +1398,6 @@ steps:
|
||||
- failure
|
||||
---
|
||||
kind: signature
|
||||
hmac: 7fc1cb2b0cfdc84d7eda25ce75dd56446fc01060c03af89c91043f095e92a2b3
|
||||
hmac: 298674d9b9d8618eef47969038fd4d7516112ecbd8a4d899ec3751d997a34ce4
|
||||
|
||||
...
|
||||
|
||||
@@ -30,5 +30,10 @@
|
||||
],
|
||||
"i18n-ally.sortKeys": true,
|
||||
"i18n-ally.keepFulfilled": true,
|
||||
"i18n-ally.keystyle": "nested"
|
||||
"i18n-ally.keystyle": "nested",
|
||||
|
||||
// unplugin-vue-router
|
||||
// https://uvr.esm.is/introduction.html#setup
|
||||
"typescript.tsdk": "node_modules/typescript/lib",
|
||||
"typescript.preferences.autoImportFileExcludePatterns": ["vue-router/auto$"]
|
||||
}
|
||||
@@ -7,6 +7,30 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
All releases can be found on https://code.vikunja.io/vikunja/releases.
|
||||
|
||||
## [0.24.6] - 2024-12-22
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* *(export)* Update only current user export file id
|
||||
|
||||
## [0.24.5] - 2024-11-21
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* *(attachments)* Check permissions when accessing all attachments
|
||||
* *(saved filters)* Check permissions when accessing tasks of a filter
|
||||
* Pin xgo to 1.22.x ([87b2aac](87b2aaccb8cdcbe1ecb6092951a0bfe224ad7006))
|
||||
* Upgrade xgo ([19b63c8](19b63c86c51f67614b867c75a58cda1774685edd))
|
||||
* Upgrade xgo docker image everywhere ([04b40f8](04b40f8a7dcd01a86ddb8b27596073d1e50f9e97))
|
||||
* *(ci)* Do not build linux 368 docker images
|
||||
* Disable 368 releases ([73db10f](73db10fb02268e07d29842493df55f4d645ac503))
|
||||
- **BREAKING**: disable 368 releases
|
||||
|
||||
### Miscellaneous Tasks
|
||||
|
||||
* Sign drone config ([17c4878](17c487875b5771c0971ee8bf030807171de2dddc))
|
||||
* Go mod tidy ([9639025](96390257e0911089ae33a9565e8be7fa954c772c))
|
||||
|
||||
## [0.24.4] - 2024-09-29
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# syntax=docker/dockerfile:1
|
||||
FROM --platform=$BUILDPLATFORM node:22.11.0-alpine AS frontendbuilder
|
||||
FROM --platform=$BUILDPLATFORM node:22.13.0-alpine AS frontendbuilder
|
||||
|
||||
WORKDIR /build
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
[](https://drone.kolaente.de/vikunja/vikunja)
|
||||
[](LICENSE)
|
||||
[](https://vikunja.io/docs/installing)
|
||||
[](https://vikunja.io/docs/installing)
|
||||
[](https://hub.docker.com/r/vikunja/vikunja/)
|
||||
[](https://try.vikunja.io/api/v1/docs)
|
||||
[](https://goreportcard.com/report/kolaente.dev/vikunja/vikunja)
|
||||
|
||||
@@ -251,7 +251,7 @@
|
||||
{
|
||||
"key": "url",
|
||||
"default_value": "",
|
||||
"comment": "The url to the Typesense instance you want to use. Can be hosted locally or in Typesense Cloud as long\nas Vikunja is able to reach it."
|
||||
"comment": "The url to the Typesense instance you want to use. Can be hosted locally or in Typesense Cloud as long as Vikunja is able to reach it. Must be a http(s) url."
|
||||
},
|
||||
{
|
||||
"key": "apikey",
|
||||
|
||||
@@ -51,11 +51,11 @@
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"electron": "33.2.0",
|
||||
"electron": "34.0.0",
|
||||
"electron-builder": "25.1.8"
|
||||
},
|
||||
"dependencies": {
|
||||
"connect-history-api-fallback": "2.0.0",
|
||||
"express": "4.21.1"
|
||||
"express": "4.21.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,12 +12,12 @@ importers:
|
||||
specifier: 2.0.0
|
||||
version: 2.0.0
|
||||
express:
|
||||
specifier: 4.21.1
|
||||
version: 4.21.1
|
||||
specifier: 4.21.2
|
||||
version: 4.21.2
|
||||
devDependencies:
|
||||
electron:
|
||||
specifier: 33.2.0
|
||||
version: 33.2.0
|
||||
specifier: 34.0.0
|
||||
version: 34.0.0
|
||||
electron-builder:
|
||||
specifier: 25.1.8
|
||||
version: 25.1.8(electron-builder-squirrel-windows@24.13.3)
|
||||
@@ -31,6 +31,11 @@ packages:
|
||||
resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==}
|
||||
engines: {node: '>= 8.9.0'}
|
||||
|
||||
'@electron/asar@3.2.17':
|
||||
resolution: {integrity: sha512-OcWImUI686w8LkghQj9R2ynZ2ME693Ek6L1SiaAgqGKzBaTIZw3fHDqN82Rcl+EU1Gm9EgkJ5KLIY/q5DCRbbA==}
|
||||
engines: {node: '>=10.12.0'}
|
||||
hasBin: true
|
||||
|
||||
'@electron/asar@3.2.9':
|
||||
resolution: {integrity: sha512-Vu2P3X2gcZ3MY9W7yH72X9+AMXwUQZEJBrsPIbX0JsdllLtoh62/Q8Wg370/DawIEVKOyfD6KtTLo645ezqxUA==}
|
||||
engines: {node: '>=10.12.0'}
|
||||
@@ -260,6 +265,9 @@ packages:
|
||||
async@3.2.5:
|
||||
resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==}
|
||||
|
||||
async@3.2.6:
|
||||
resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
|
||||
|
||||
asynckit@0.4.0:
|
||||
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
|
||||
|
||||
@@ -446,6 +454,9 @@ packages:
|
||||
core-util-is@1.0.2:
|
||||
resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
|
||||
|
||||
core-util-is@1.0.3:
|
||||
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
|
||||
|
||||
crc-32@1.2.2:
|
||||
resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
|
||||
engines: {node: '>=0.8'}
|
||||
@@ -458,8 +469,8 @@ packages:
|
||||
crc@3.8.0:
|
||||
resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==}
|
||||
|
||||
cross-spawn@7.0.3:
|
||||
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
|
||||
cross-spawn@7.0.6:
|
||||
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
debug@2.6.9:
|
||||
@@ -470,8 +481,8 @@ packages:
|
||||
supports-color:
|
||||
optional: true
|
||||
|
||||
debug@4.3.4:
|
||||
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
|
||||
debug@4.3.7:
|
||||
resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
|
||||
engines: {node: '>=6.0'}
|
||||
peerDependencies:
|
||||
supports-color: '*'
|
||||
@@ -575,8 +586,8 @@ packages:
|
||||
electron-publish@25.1.7:
|
||||
resolution: {integrity: sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==}
|
||||
|
||||
electron@33.2.0:
|
||||
resolution: {integrity: sha512-PVw1ICAQDPsnnsmpNFX/b1i/49h67pbSPxuIENd9K9WpGO1tsRaQt+K2bmXqTuoMJsbzIc75Ce8zqtuwBPqawA==}
|
||||
electron@34.0.0:
|
||||
resolution: {integrity: sha512-fpaPb0lifoUJ6UJa4Lk8/0B2Ku/xDZWdc1Gkj67jbygTCrvSon0qquju6Ltx1Kz23GRqqlIHXiy9EvrjpY7/Wg==}
|
||||
engines: {node: '>= 12.20.55'}
|
||||
hasBin: true
|
||||
|
||||
@@ -636,8 +647,8 @@ packages:
|
||||
exponential-backoff@3.1.1:
|
||||
resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==}
|
||||
|
||||
express@4.21.1:
|
||||
resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==}
|
||||
express@4.21.2:
|
||||
resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
|
||||
engines: {node: '>= 0.10.0'}
|
||||
|
||||
extract-zip@2.0.1:
|
||||
@@ -669,10 +680,18 @@ packages:
|
||||
resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==}
|
||||
engines: {node: '>=14'}
|
||||
|
||||
foreground-child@3.3.0:
|
||||
resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
|
||||
engines: {node: '>=14'}
|
||||
|
||||
form-data@4.0.0:
|
||||
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
|
||||
engines: {node: '>= 6'}
|
||||
|
||||
form-data@4.0.1:
|
||||
resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
|
||||
engines: {node: '>= 6'}
|
||||
|
||||
forwarded@0.2.0:
|
||||
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
|
||||
engines: {node: '>= 0.6'}
|
||||
@@ -732,6 +751,10 @@ packages:
|
||||
engines: {node: '>=16 || 14 >=14.17'}
|
||||
hasBin: true
|
||||
|
||||
glob@10.4.5:
|
||||
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
|
||||
hasBin: true
|
||||
|
||||
glob@7.2.3:
|
||||
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
|
||||
deprecated: Glob versions prior to v9 are no longer supported
|
||||
@@ -887,6 +910,10 @@ packages:
|
||||
resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==}
|
||||
engines: {node: '>= 18.0.0'}
|
||||
|
||||
isbinaryfile@5.0.4:
|
||||
resolution: {integrity: sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==}
|
||||
engines: {node: '>= 18.0.0'}
|
||||
|
||||
isexe@2.0.0:
|
||||
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
|
||||
|
||||
@@ -894,6 +921,9 @@ packages:
|
||||
resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
|
||||
engines: {node: '>=14'}
|
||||
|
||||
jackspeak@3.4.3:
|
||||
resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
|
||||
|
||||
jake@10.8.7:
|
||||
resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==}
|
||||
engines: {node: '>=10'}
|
||||
@@ -966,6 +996,9 @@ packages:
|
||||
resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==}
|
||||
engines: {node: 14 || >=16.14}
|
||||
|
||||
lru-cache@10.4.3:
|
||||
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
|
||||
|
||||
lru-cache@6.0.0:
|
||||
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
|
||||
engines: {node: '>=10'}
|
||||
@@ -1038,6 +1071,10 @@ packages:
|
||||
resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==}
|
||||
engines: {node: '>=16 || 14 >=14.17'}
|
||||
|
||||
minimatch@9.0.5:
|
||||
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
|
||||
engines: {node: '>=16 || 14 >=14.17'}
|
||||
|
||||
minimist@1.2.8:
|
||||
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
|
||||
|
||||
@@ -1073,6 +1110,10 @@ packages:
|
||||
resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
|
||||
engines: {node: '>=16 || 14 >=14.17'}
|
||||
|
||||
minipass@7.1.2:
|
||||
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
|
||||
engines: {node: '>=16 || 14 >=14.17'}
|
||||
|
||||
minizlib@2.1.2:
|
||||
resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
|
||||
engines: {node: '>= 8'}
|
||||
@@ -1085,9 +1126,6 @@ packages:
|
||||
ms@2.0.0:
|
||||
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
|
||||
|
||||
ms@2.1.2:
|
||||
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
|
||||
|
||||
ms@2.1.3:
|
||||
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
|
||||
|
||||
@@ -1162,6 +1200,9 @@ packages:
|
||||
resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
package-json-from-dist@1.0.1:
|
||||
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
|
||||
|
||||
parseurl@1.3.3:
|
||||
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
@@ -1178,8 +1219,12 @@ packages:
|
||||
resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==}
|
||||
engines: {node: '>=16 || 14 >=14.17'}
|
||||
|
||||
path-to-regexp@0.1.10:
|
||||
resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==}
|
||||
path-scurry@1.11.1:
|
||||
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
|
||||
engines: {node: '>=16 || 14 >=14.18'}
|
||||
|
||||
path-to-regexp@0.1.12:
|
||||
resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
|
||||
|
||||
pe-library@0.4.1:
|
||||
resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==}
|
||||
@@ -1302,6 +1347,9 @@ packages:
|
||||
sax@1.3.0:
|
||||
resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==}
|
||||
|
||||
sax@1.4.1:
|
||||
resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
|
||||
|
||||
semver-compare@1.0.0:
|
||||
resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==}
|
||||
|
||||
@@ -1314,6 +1362,11 @@ packages:
|
||||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
|
||||
semver@7.6.3:
|
||||
resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
|
||||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
|
||||
send@0.19.0:
|
||||
resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
@@ -1469,6 +1522,11 @@ packages:
|
||||
engines: {node: '>=14.17'}
|
||||
hasBin: true
|
||||
|
||||
typescript@5.6.3:
|
||||
resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
|
||||
engines: {node: '>=14.17'}
|
||||
hasBin: true
|
||||
|
||||
undici-types@5.26.5:
|
||||
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
|
||||
|
||||
@@ -1574,6 +1632,12 @@ snapshots:
|
||||
ajv: 6.12.6
|
||||
ajv-keywords: 3.5.2(ajv@6.12.6)
|
||||
|
||||
'@electron/asar@3.2.17':
|
||||
dependencies:
|
||||
commander: 5.1.0
|
||||
glob: 7.2.3
|
||||
minimatch: 3.1.2
|
||||
|
||||
'@electron/asar@3.2.9':
|
||||
dependencies:
|
||||
commander: 5.1.0
|
||||
@@ -1582,7 +1646,7 @@ snapshots:
|
||||
|
||||
'@electron/get@2.0.3':
|
||||
dependencies:
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
env-paths: 2.2.1
|
||||
fs-extra: 8.1.0
|
||||
got: 11.8.6
|
||||
@@ -1596,7 +1660,7 @@ snapshots:
|
||||
|
||||
'@electron/notarize@2.2.1':
|
||||
dependencies:
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
fs-extra: 9.1.0
|
||||
promise-retry: 2.0.1
|
||||
transitivePeerDependencies:
|
||||
@@ -1604,7 +1668,7 @@ snapshots:
|
||||
|
||||
'@electron/notarize@2.5.0':
|
||||
dependencies:
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
fs-extra: 9.1.0
|
||||
promise-retry: 2.0.1
|
||||
transitivePeerDependencies:
|
||||
@@ -1613,7 +1677,7 @@ snapshots:
|
||||
'@electron/osx-sign@1.0.5':
|
||||
dependencies:
|
||||
compare-version: 0.1.2
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
fs-extra: 10.1.0
|
||||
isbinaryfile: 4.0.10
|
||||
minimist: 1.2.8
|
||||
@@ -1624,7 +1688,7 @@ snapshots:
|
||||
'@electron/osx-sign@1.3.1':
|
||||
dependencies:
|
||||
compare-version: 0.1.2
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
fs-extra: 10.1.0
|
||||
isbinaryfile: 4.0.10
|
||||
minimist: 1.2.8
|
||||
@@ -1636,7 +1700,7 @@ snapshots:
|
||||
dependencies:
|
||||
'@malept/cross-spawn-promise': 2.0.0
|
||||
chalk: 4.1.2
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
detect-libc: 2.0.3
|
||||
fs-extra: 10.1.0
|
||||
got: 11.8.6
|
||||
@@ -1645,7 +1709,7 @@ snapshots:
|
||||
node-gyp: 9.4.1
|
||||
ora: 5.4.1
|
||||
read-binary-file-arch: 1.0.6
|
||||
semver: 7.6.0
|
||||
semver: 7.6.3
|
||||
tar: 6.2.1
|
||||
yargs: 17.7.2
|
||||
transitivePeerDependencies:
|
||||
@@ -1654,9 +1718,9 @@ snapshots:
|
||||
|
||||
'@electron/universal@1.5.1':
|
||||
dependencies:
|
||||
'@electron/asar': 3.2.9
|
||||
'@electron/asar': 3.2.17
|
||||
'@malept/cross-spawn-promise': 1.1.1
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
dir-compare: 3.3.0
|
||||
fs-extra: 9.1.0
|
||||
minimatch: 3.1.2
|
||||
@@ -1668,7 +1732,7 @@ snapshots:
|
||||
dependencies:
|
||||
'@electron/asar': 3.2.9
|
||||
'@malept/cross-spawn-promise': 2.0.0
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
dir-compare: 4.2.0
|
||||
fs-extra: 11.2.0
|
||||
minimatch: 9.0.4
|
||||
@@ -1689,15 +1753,15 @@ snapshots:
|
||||
|
||||
'@malept/cross-spawn-promise@1.1.1':
|
||||
dependencies:
|
||||
cross-spawn: 7.0.3
|
||||
cross-spawn: 7.0.6
|
||||
|
||||
'@malept/cross-spawn-promise@2.0.0':
|
||||
dependencies:
|
||||
cross-spawn: 7.0.3
|
||||
cross-spawn: 7.0.6
|
||||
|
||||
'@malept/flatpak-bundler@0.4.0':
|
||||
dependencies:
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
fs-extra: 9.1.0
|
||||
lodash: 4.17.21
|
||||
tmp-promise: 3.0.3
|
||||
@@ -1707,7 +1771,7 @@ snapshots:
|
||||
'@npmcli/fs@2.1.2':
|
||||
dependencies:
|
||||
'@gar/promisify': 1.1.3
|
||||
semver: 7.6.0
|
||||
semver: 7.6.3
|
||||
|
||||
'@npmcli/move-file@2.0.1':
|
||||
dependencies:
|
||||
@@ -1781,13 +1845,13 @@ snapshots:
|
||||
|
||||
agent-base@6.0.2:
|
||||
dependencies:
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
agent-base@7.1.1:
|
||||
dependencies:
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -1838,22 +1902,22 @@ snapshots:
|
||||
builder-util: 24.13.1
|
||||
builder-util-runtime: 9.2.4
|
||||
chromium-pickle-js: 0.2.0
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
dmg-builder: 25.1.8(electron-builder-squirrel-windows@24.13.3)
|
||||
ejs: 3.1.10
|
||||
electron-builder-squirrel-windows: 24.13.3(dmg-builder@25.1.8)
|
||||
electron-publish: 24.13.1
|
||||
form-data: 4.0.0
|
||||
form-data: 4.0.1
|
||||
fs-extra: 10.1.0
|
||||
hosted-git-info: 4.1.0
|
||||
is-ci: 3.0.1
|
||||
isbinaryfile: 5.0.2
|
||||
isbinaryfile: 5.0.4
|
||||
js-yaml: 4.1.0
|
||||
lazy-val: 1.0.5
|
||||
minimatch: 5.1.6
|
||||
read-config-file: 6.3.2
|
||||
sanitize-filename: 1.6.3
|
||||
semver: 7.6.0
|
||||
semver: 7.6.3
|
||||
tar: 6.2.1
|
||||
temp-file: 3.4.0
|
||||
transitivePeerDependencies:
|
||||
@@ -1874,7 +1938,7 @@ snapshots:
|
||||
builder-util-runtime: 9.2.10
|
||||
chromium-pickle-js: 0.2.0
|
||||
config-file-ts: 0.2.8-rc1
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
dmg-builder: 25.1.8(electron-builder-squirrel-windows@24.13.3)
|
||||
dotenv: 16.4.5
|
||||
dotenv-expand: 11.0.6
|
||||
@@ -1930,7 +1994,7 @@ snapshots:
|
||||
archiver@5.3.2:
|
||||
dependencies:
|
||||
archiver-utils: 2.1.0
|
||||
async: 3.2.5
|
||||
async: 3.2.6
|
||||
buffer-crc32: 0.2.13
|
||||
readable-stream: 3.6.2
|
||||
readdir-glob: 1.1.3
|
||||
@@ -1956,6 +2020,8 @@ snapshots:
|
||||
|
||||
async@3.2.5: {}
|
||||
|
||||
async@3.2.6: {}
|
||||
|
||||
asynckit@0.4.0: {}
|
||||
|
||||
at-least-node@1.0.0: {}
|
||||
@@ -2018,15 +2084,15 @@ snapshots:
|
||||
|
||||
builder-util-runtime@9.2.10:
|
||||
dependencies:
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
sax: 1.3.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
builder-util-runtime@9.2.4:
|
||||
dependencies:
|
||||
debug: 4.3.4
|
||||
sax: 1.3.0
|
||||
debug: 4.3.7
|
||||
sax: 1.4.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -2038,8 +2104,8 @@ snapshots:
|
||||
bluebird-lst: 1.0.9
|
||||
builder-util-runtime: 9.2.4
|
||||
chalk: 4.1.2
|
||||
cross-spawn: 7.0.3
|
||||
debug: 4.3.4
|
||||
cross-spawn: 7.0.6
|
||||
debug: 4.3.7
|
||||
fs-extra: 10.1.0
|
||||
http-proxy-agent: 5.0.0
|
||||
https-proxy-agent: 5.0.1
|
||||
@@ -2059,8 +2125,8 @@ snapshots:
|
||||
bluebird-lst: 1.0.9
|
||||
builder-util-runtime: 9.2.10
|
||||
chalk: 4.1.2
|
||||
cross-spawn: 7.0.3
|
||||
debug: 4.3.4
|
||||
cross-spawn: 7.0.6
|
||||
debug: 4.3.7
|
||||
fs-extra: 10.1.0
|
||||
http-proxy-agent: 7.0.2
|
||||
https-proxy-agent: 7.0.5
|
||||
@@ -2181,8 +2247,8 @@ snapshots:
|
||||
|
||||
config-file-ts@0.2.6:
|
||||
dependencies:
|
||||
glob: 10.3.12
|
||||
typescript: 5.4.5
|
||||
glob: 10.4.5
|
||||
typescript: 5.6.3
|
||||
|
||||
config-file-ts@0.2.8-rc1:
|
||||
dependencies:
|
||||
@@ -2203,7 +2269,10 @@ snapshots:
|
||||
|
||||
cookie@0.7.1: {}
|
||||
|
||||
core-util-is@1.0.2: {}
|
||||
core-util-is@1.0.2:
|
||||
optional: true
|
||||
|
||||
core-util-is@1.0.3: {}
|
||||
|
||||
crc-32@1.2.2: {}
|
||||
|
||||
@@ -2217,7 +2286,7 @@ snapshots:
|
||||
buffer: 5.7.1
|
||||
optional: true
|
||||
|
||||
cross-spawn@7.0.3:
|
||||
cross-spawn@7.0.6:
|
||||
dependencies:
|
||||
path-key: 3.1.1
|
||||
shebang-command: 2.0.0
|
||||
@@ -2227,9 +2296,9 @@ snapshots:
|
||||
dependencies:
|
||||
ms: 2.0.0
|
||||
|
||||
debug@4.3.4:
|
||||
debug@4.3.7:
|
||||
dependencies:
|
||||
ms: 2.1.2
|
||||
ms: 2.1.3
|
||||
|
||||
decompress-response@6.0.0:
|
||||
dependencies:
|
||||
@@ -2373,7 +2442,7 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
electron@33.2.0:
|
||||
electron@34.0.0:
|
||||
dependencies:
|
||||
'@electron/get': 2.0.3
|
||||
'@types/node': 20.12.7
|
||||
@@ -2422,7 +2491,7 @@ snapshots:
|
||||
|
||||
exponential-backoff@3.1.1: {}
|
||||
|
||||
express@4.21.1:
|
||||
express@4.21.2:
|
||||
dependencies:
|
||||
accepts: 1.3.8
|
||||
array-flatten: 1.1.1
|
||||
@@ -2443,7 +2512,7 @@ snapshots:
|
||||
methods: 1.1.2
|
||||
on-finished: 2.4.1
|
||||
parseurl: 1.3.3
|
||||
path-to-regexp: 0.1.10
|
||||
path-to-regexp: 0.1.12
|
||||
proxy-addr: 2.0.7
|
||||
qs: 6.13.0
|
||||
range-parser: 1.2.1
|
||||
@@ -2460,7 +2529,7 @@ snapshots:
|
||||
|
||||
extract-zip@2.0.1:
|
||||
dependencies:
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
get-stream: 5.2.0
|
||||
yauzl: 2.10.0
|
||||
optionalDependencies:
|
||||
@@ -2497,7 +2566,12 @@ snapshots:
|
||||
|
||||
foreground-child@3.1.1:
|
||||
dependencies:
|
||||
cross-spawn: 7.0.3
|
||||
cross-spawn: 7.0.6
|
||||
signal-exit: 4.1.0
|
||||
|
||||
foreground-child@3.3.0:
|
||||
dependencies:
|
||||
cross-spawn: 7.0.6
|
||||
signal-exit: 4.1.0
|
||||
|
||||
form-data@4.0.0:
|
||||
@@ -2506,6 +2580,12 @@ snapshots:
|
||||
combined-stream: 1.0.8
|
||||
mime-types: 2.1.35
|
||||
|
||||
form-data@4.0.1:
|
||||
dependencies:
|
||||
asynckit: 0.4.0
|
||||
combined-stream: 1.0.8
|
||||
mime-types: 2.1.35
|
||||
|
||||
forwarded@0.2.0: {}
|
||||
|
||||
fresh@0.5.2: {}
|
||||
@@ -2578,6 +2658,15 @@ snapshots:
|
||||
minipass: 7.0.4
|
||||
path-scurry: 1.10.2
|
||||
|
||||
glob@10.4.5:
|
||||
dependencies:
|
||||
foreground-child: 3.3.0
|
||||
jackspeak: 3.4.3
|
||||
minimatch: 9.0.5
|
||||
minipass: 7.1.2
|
||||
package-json-from-dist: 1.0.1
|
||||
path-scurry: 1.11.1
|
||||
|
||||
glob@7.2.3:
|
||||
dependencies:
|
||||
fs.realpath: 1.0.0
|
||||
@@ -2601,7 +2690,7 @@ snapshots:
|
||||
es6-error: 4.1.1
|
||||
matcher: 3.0.0
|
||||
roarr: 2.15.4
|
||||
semver: 7.6.0
|
||||
semver: 7.6.3
|
||||
serialize-error: 7.0.1
|
||||
optional: true
|
||||
|
||||
@@ -2664,14 +2753,14 @@ snapshots:
|
||||
dependencies:
|
||||
'@tootallnate/once': 2.0.0
|
||||
agent-base: 6.0.2
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
http-proxy-agent@7.0.2:
|
||||
dependencies:
|
||||
agent-base: 7.1.1
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -2683,14 +2772,14 @@ snapshots:
|
||||
https-proxy-agent@5.0.1:
|
||||
dependencies:
|
||||
agent-base: 6.0.2
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
https-proxy-agent@7.0.5:
|
||||
dependencies:
|
||||
agent-base: 7.1.1
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -2752,6 +2841,8 @@ snapshots:
|
||||
|
||||
isbinaryfile@5.0.2: {}
|
||||
|
||||
isbinaryfile@5.0.4: {}
|
||||
|
||||
isexe@2.0.0: {}
|
||||
|
||||
jackspeak@2.3.6:
|
||||
@@ -2760,6 +2851,12 @@ snapshots:
|
||||
optionalDependencies:
|
||||
'@pkgjs/parseargs': 0.11.0
|
||||
|
||||
jackspeak@3.4.3:
|
||||
dependencies:
|
||||
'@isaacs/cliui': 8.0.2
|
||||
optionalDependencies:
|
||||
'@pkgjs/parseargs': 0.11.0
|
||||
|
||||
jake@10.8.7:
|
||||
dependencies:
|
||||
async: 3.2.5
|
||||
@@ -2823,6 +2920,8 @@ snapshots:
|
||||
|
||||
lru-cache@10.2.0: {}
|
||||
|
||||
lru-cache@10.4.3: {}
|
||||
|
||||
lru-cache@6.0.0:
|
||||
dependencies:
|
||||
yallist: 4.0.0
|
||||
@@ -2894,6 +2993,10 @@ snapshots:
|
||||
dependencies:
|
||||
brace-expansion: 2.0.1
|
||||
|
||||
minimatch@9.0.5:
|
||||
dependencies:
|
||||
brace-expansion: 2.0.1
|
||||
|
||||
minimist@1.2.8: {}
|
||||
|
||||
minipass-collect@1.0.2:
|
||||
@@ -2928,6 +3031,8 @@ snapshots:
|
||||
|
||||
minipass@7.0.4: {}
|
||||
|
||||
minipass@7.1.2: {}
|
||||
|
||||
minizlib@2.1.2:
|
||||
dependencies:
|
||||
minipass: 3.3.6
|
||||
@@ -2937,22 +3042,20 @@ snapshots:
|
||||
|
||||
ms@2.0.0: {}
|
||||
|
||||
ms@2.1.2: {}
|
||||
|
||||
ms@2.1.3: {}
|
||||
|
||||
negotiator@0.6.3: {}
|
||||
|
||||
node-abi@3.71.0:
|
||||
dependencies:
|
||||
semver: 7.6.0
|
||||
semver: 7.6.3
|
||||
|
||||
node-addon-api@1.7.2:
|
||||
optional: true
|
||||
|
||||
node-api-version@0.2.0:
|
||||
dependencies:
|
||||
semver: 7.6.0
|
||||
semver: 7.6.3
|
||||
|
||||
node-gyp@9.4.1:
|
||||
dependencies:
|
||||
@@ -2964,7 +3067,7 @@ snapshots:
|
||||
nopt: 6.0.0
|
||||
npmlog: 6.0.2
|
||||
rimraf: 3.0.2
|
||||
semver: 7.6.0
|
||||
semver: 7.6.3
|
||||
tar: 6.2.1
|
||||
which: 2.0.2
|
||||
transitivePeerDependencies:
|
||||
@@ -3025,6 +3128,8 @@ snapshots:
|
||||
dependencies:
|
||||
aggregate-error: 3.1.0
|
||||
|
||||
package-json-from-dist@1.0.1: {}
|
||||
|
||||
parseurl@1.3.3: {}
|
||||
|
||||
path-is-absolute@1.0.1: {}
|
||||
@@ -3036,7 +3141,12 @@ snapshots:
|
||||
lru-cache: 10.2.0
|
||||
minipass: 7.0.4
|
||||
|
||||
path-to-regexp@0.1.10: {}
|
||||
path-scurry@1.11.1:
|
||||
dependencies:
|
||||
lru-cache: 10.4.3
|
||||
minipass: 7.1.2
|
||||
|
||||
path-to-regexp@0.1.12: {}
|
||||
|
||||
pe-library@0.4.1: {}
|
||||
|
||||
@@ -3088,7 +3198,7 @@ snapshots:
|
||||
|
||||
read-binary-file-arch@1.0.6:
|
||||
dependencies:
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -3103,7 +3213,7 @@ snapshots:
|
||||
|
||||
readable-stream@2.3.8:
|
||||
dependencies:
|
||||
core-util-is: 1.0.2
|
||||
core-util-is: 1.0.3
|
||||
inherits: 2.0.4
|
||||
isarray: 1.0.0
|
||||
process-nextick-args: 2.0.1
|
||||
@@ -3166,6 +3276,8 @@ snapshots:
|
||||
|
||||
sax@1.3.0: {}
|
||||
|
||||
sax@1.4.1: {}
|
||||
|
||||
semver-compare@1.0.0:
|
||||
optional: true
|
||||
|
||||
@@ -3175,6 +3287,8 @@ snapshots:
|
||||
dependencies:
|
||||
lru-cache: 6.0.0
|
||||
|
||||
semver@7.6.3: {}
|
||||
|
||||
send@0.19.0:
|
||||
dependencies:
|
||||
debug: 2.6.9
|
||||
@@ -3256,7 +3370,7 @@ snapshots:
|
||||
socks-proxy-agent@7.0.0:
|
||||
dependencies:
|
||||
agent-base: 6.0.2
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
socks: 2.8.3
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
@@ -3313,7 +3427,7 @@ snapshots:
|
||||
|
||||
sumchecker@3.0.1:
|
||||
dependencies:
|
||||
debug: 4.3.4
|
||||
debug: 4.3.7
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -3365,6 +3479,8 @@ snapshots:
|
||||
|
||||
typescript@5.4.5: {}
|
||||
|
||||
typescript@5.6.3: {}
|
||||
|
||||
undici-types@5.26.5: {}
|
||||
|
||||
unique-filename@2.0.1:
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
let
|
||||
pkgs-unstable = import inputs.nixpkgs-unstable { system = pkgs.stdenv.system; };
|
||||
in {
|
||||
scripts.patch-sass-embedded.exec = ''
|
||||
find node_modules/.pnpm/sass-embedded-linux-*/node_modules/sass-embedded-linux-*/dart-sass/src -name dart -print0 | xargs -I {} -0 patchelf --set-interpreter "$(<$NIX_CC/nix-support/dynamic-linker)" {}
|
||||
'';
|
||||
|
||||
packages = with pkgs-unstable; [
|
||||
# General tools
|
||||
git-cliff
|
||||
@@ -27,7 +31,6 @@ in {
|
||||
|
||||
go = {
|
||||
enable = true;
|
||||
enableHardeningWorkaround = true;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -11,6 +11,8 @@ stats.html
|
||||
node_modules
|
||||
.DS_Store
|
||||
dist
|
||||
dist-dev
|
||||
dist-test
|
||||
coverage
|
||||
*.zip
|
||||
.vite/
|
||||
|
||||
@@ -1 +1 @@
|
||||
22.11.0
|
||||
22.13.0
|
||||
@@ -2,30 +2,14 @@
|
||||
|
||||
> The todo app to organize your life.
|
||||
|
||||
[](https://drone.kolaente.de/vikunja/vikunja)
|
||||
[](LICENSE)
|
||||
[](https://dl.vikunja.io)
|
||||
[](https://crowdin.com/project/vikunja)
|
||||
|
||||
This is the web frontend for Vikunja, written in Vue.js.
|
||||
|
||||
Take a look at [our roadmap](https://my.vikunja.cloud/share/UrdhKPqumxDXUbYpEGJLSIyNTwAnbBzVlwdDpRbv/auth) (hosted on Vikunja!) for a list of things we're currently working on!
|
||||
|
||||
## Security Reports
|
||||
|
||||
If you find any security-related issues you don't want to disclose publicly, please use [the contact information on our website](https://vikunja.io/contact/#security).
|
||||
|
||||
## Docker
|
||||
|
||||
There is a [docker image available](https://hub.docker.com/r/vikunja/vikunja) with support for http/2 and aggressive caching enabled.
|
||||
In order to build it from sources run the command below. (Docker >= v19.03)
|
||||
|
||||
```shell
|
||||
export DOCKER_BUILDKIT=1
|
||||
docker build -t vikunja/frontend .
|
||||
```
|
||||
|
||||
Refer to [multi-platform documentation](https://docs.docker.com/build/building/multi-platform/) in order to build for different platforms.
|
||||
For general information about the project, refer to the top-level readme of this repo.
|
||||
|
||||
## Project setup
|
||||
|
||||
@@ -36,7 +20,7 @@ pnpm install
|
||||
### Compiles and hot-reloads for development
|
||||
|
||||
```shell
|
||||
pnpm run serve
|
||||
pnpm run dev
|
||||
```
|
||||
|
||||
### Compiles and minifies for production
|
||||
|
||||
@@ -59,7 +59,7 @@ describe('Projects', () => {
|
||||
cy.get('.menu-container .menu-list li:first-child .dropdown .dropdown-content')
|
||||
.contains('Edit')
|
||||
.click()
|
||||
cy.get('#title')
|
||||
cy.get('#title:not(:disabled)')
|
||||
.type(`{selectall}${newProjectName}`)
|
||||
cy.get('footer.card-footer .button')
|
||||
.contains('Save')
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
declare module 'postcss-easings' {
|
||||
import postcssEasings from 'postcss-easings'
|
||||
export default postcssEasings
|
||||
}
|
||||
|
||||
declare module 'postcss-easing-gradients' {
|
||||
import postcssEasingGradients from 'postcss-easing-gradients'
|
||||
export default postcssEasingGradients
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
/// <reference types="vite-svg-loader" />
|
||||
/// <reference types="cypress" />
|
||||
/// <reference types="@histoire/plugin-vue/components" />
|
||||
/// <reference types="unplugin-vue-router/client" />
|
||||
|
||||
interface ImportMetaEnv {
|
||||
readonly VIKUNJA_API_URL?: string
|
||||
@@ -16,6 +17,8 @@ interface ImportMetaEnv {
|
||||
readonly SENTRY_PROJECT?: string
|
||||
|
||||
readonly VITE_IS_ONLINE: boolean
|
||||
|
||||
readonly VUE_DEVTOOLS_LAUNCH_EDITOR: VitePluginVueDevToolsOptions.launchEditor
|
||||
}
|
||||
|
||||
interface ImportMeta {
|
||||
|
||||
@@ -84,5 +84,14 @@ export default [
|
||||
// 'cypress/*',
|
||||
// ],
|
||||
},
|
||||
|
||||
{
|
||||
// unplugin-vue-router
|
||||
// https://uvr.esm.is/guide/eslint.html#eslint
|
||||
settings: {
|
||||
'import/core-modules': ['vue-router/auto-routes'],
|
||||
},
|
||||
globals: {
|
||||
'definePage': 'readonly',
|
||||
},
|
||||
},
|
||||
]
|
||||
@@ -13,7 +13,7 @@
|
||||
},
|
||||
"homepage": "https://vikunja.io/",
|
||||
"funding": "https://opencollective.com/vikunja",
|
||||
"packageManager": "pnpm@9.13.2",
|
||||
"packageManager": "pnpm@9.15.4",
|
||||
"keywords": [
|
||||
"todo",
|
||||
"productivity",
|
||||
@@ -30,8 +30,7 @@
|
||||
"preview:dev": "vite preview --outDir dist-dev --mode development --port 4173",
|
||||
"preview:test": "vite preview --port 4173 --outDir dist-test",
|
||||
"build": "vite build && workbox copyLibraries dist/",
|
||||
"build:test": "vite build --outDir dist-test && workbox copyLibraries dist-dev/",
|
||||
"build:modern-only": "BUILD_MODERN_ONLY=true vite build && workbox copyLibraries dist/",
|
||||
"build:test": "vite build --outDir dist-test && workbox copyLibraries dist-test/",
|
||||
"build:dev": "vite build --mode development --outDir dist-dev/",
|
||||
"lint": "eslint 'src/**/*.{js,ts,vue}'",
|
||||
"lint:fix": "pnpm run lint --fix",
|
||||
@@ -50,129 +49,113 @@
|
||||
"story:preview": "histoire preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@fortawesome/fontawesome-svg-core": "6.6.0",
|
||||
"@fortawesome/free-regular-svg-icons": "6.6.0",
|
||||
"@fortawesome/free-solid-svg-icons": "6.6.0",
|
||||
"@fortawesome/fontawesome-svg-core": "6.7.2",
|
||||
"@fortawesome/free-regular-svg-icons": "6.7.2",
|
||||
"@fortawesome/free-solid-svg-icons": "6.7.2",
|
||||
"@fortawesome/vue-fontawesome": "3.0.8",
|
||||
"@github/hotkey": "3.1.1",
|
||||
"@infectoone/vue-ganttastic": "2.3.2",
|
||||
"@intlify/unplugin-vue-i18n": "6.0.0",
|
||||
"@intlify/unplugin-vue-i18n": "6.0.3",
|
||||
"@kyvg/vue3-notification": "3.4.1",
|
||||
"@sentry/tracing": "7.114.0",
|
||||
"@sentry/vue": "8.38.0",
|
||||
"@tiptap/core": "2.9.1",
|
||||
"@tiptap/extension-blockquote": "2.9.1",
|
||||
"@tiptap/extension-bold": "2.9.1",
|
||||
"@tiptap/extension-bullet-list": "2.9.1",
|
||||
"@tiptap/extension-code": "2.9.1",
|
||||
"@tiptap/extension-code-block": "2.9.1",
|
||||
"@tiptap/extension-code-block-lowlight": "2.9.1",
|
||||
"@tiptap/extension-document": "2.9.1",
|
||||
"@tiptap/extension-dropcursor": "2.9.1",
|
||||
"@tiptap/extension-gapcursor": "2.9.1",
|
||||
"@tiptap/extension-hard-break": "2.9.1",
|
||||
"@tiptap/extension-heading": "2.9.1",
|
||||
"@tiptap/extension-history": "2.9.1",
|
||||
"@tiptap/extension-horizontal-rule": "2.9.1",
|
||||
"@tiptap/extension-image": "2.9.1",
|
||||
"@tiptap/extension-italic": "2.9.1",
|
||||
"@tiptap/extension-link": "2.9.1",
|
||||
"@tiptap/extension-list-item": "2.9.1",
|
||||
"@tiptap/extension-ordered-list": "2.9.1",
|
||||
"@tiptap/extension-paragraph": "2.9.1",
|
||||
"@tiptap/extension-placeholder": "2.9.1",
|
||||
"@tiptap/extension-strike": "2.9.1",
|
||||
"@tiptap/extension-table": "2.9.1",
|
||||
"@tiptap/extension-table-cell": "2.9.1",
|
||||
"@tiptap/extension-table-header": "2.9.1",
|
||||
"@tiptap/extension-table-row": "2.9.1",
|
||||
"@tiptap/extension-task-item": "2.9.1",
|
||||
"@tiptap/extension-task-list": "2.9.1",
|
||||
"@tiptap/extension-text": "2.9.1",
|
||||
"@tiptap/extension-typography": "2.9.1",
|
||||
"@tiptap/extension-underline": "2.9.1",
|
||||
"@tiptap/pm": "2.9.1",
|
||||
"@tiptap/suggestion": "2.9.1",
|
||||
"@tiptap/vue-3": "2.9.1",
|
||||
"@vueuse/core": "11.2.0",
|
||||
"@vueuse/router": "11.2.0",
|
||||
"axios": "1.7.7",
|
||||
"@sentry/tracing": "7.120.3",
|
||||
"@sentry/vue": "8.50.0",
|
||||
"@tiptap/core": "2.11.2",
|
||||
"@tiptap/extension-code-block": "2.11.2",
|
||||
"@tiptap/extension-code-block-lowlight": "2.11.2",
|
||||
"@tiptap/extension-hard-break": "2.11.2",
|
||||
"@tiptap/extension-image": "2.11.2",
|
||||
"@tiptap/extension-link": "2.11.2",
|
||||
"@tiptap/extension-placeholder": "2.11.2",
|
||||
"@tiptap/extension-table": "2.11.2",
|
||||
"@tiptap/extension-table-cell": "2.11.2",
|
||||
"@tiptap/extension-table-header": "2.11.2",
|
||||
"@tiptap/extension-table-row": "2.11.2",
|
||||
"@tiptap/extension-task-item": "2.11.2",
|
||||
"@tiptap/extension-task-list": "2.11.2",
|
||||
"@tiptap/extension-typography": "2.11.2",
|
||||
"@tiptap/extension-underline": "2.11.2",
|
||||
"@tiptap/pm": "2.11.2",
|
||||
"@tiptap/starter-kit": "2.11.2",
|
||||
"@tiptap/suggestion": "2.11.2",
|
||||
"@tiptap/vue-3": "2.11.2",
|
||||
"@vueuse/core": "12.4.0",
|
||||
"@vueuse/router": "12.4.0",
|
||||
"axios": "1.7.9",
|
||||
"blurhash": "2.0.5",
|
||||
"bulma-css-variables": "0.9.33",
|
||||
"change-case": "5.4.4",
|
||||
"date-fns": "4.1.0",
|
||||
"dayjs": "1.11.13",
|
||||
"dompurify": "3.2.0",
|
||||
"dompurify": "3.2.3",
|
||||
"fast-deep-equal": "3.1.3",
|
||||
"flatpickr": "4.6.13",
|
||||
"flexsearch": "0.7.43",
|
||||
"floating-vue": "5.2.2",
|
||||
"is-touch-device": "1.0.1",
|
||||
"klona": "2.0.6",
|
||||
"lowlight": "2.9.0",
|
||||
"pinia": "2.2.6",
|
||||
"lowlight": "3.3.0",
|
||||
"pinia": "2.3.0",
|
||||
"register-service-worker": "1.7.2",
|
||||
"sortablejs": "1.15.3",
|
||||
"tailwindcss": "3.4.15",
|
||||
"sortablejs": "1.15.6",
|
||||
"tailwindcss": "3.4.17",
|
||||
"tippy.js": "6.3.7",
|
||||
"ufo": "1.5.4",
|
||||
"unplugin-vue-router": "0.10.9",
|
||||
"vue": "3.5.13",
|
||||
"vue-advanced-cropper": "2.8.9",
|
||||
"vue-flatpickr-component": "11.0.5",
|
||||
"vue-i18n": "10.0.4",
|
||||
"vue-router": "4.4.5",
|
||||
"vuemoji-picker": "0.3.1",
|
||||
"vue-i18n": "11.0.1",
|
||||
"vue-router": "4.5.0",
|
||||
"vuemoji-picker": "0.3.2",
|
||||
"workbox-precaching": "7.3.0",
|
||||
"zhyswan-vuedraggable": "4.1.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@4tw/cypress-drag-drop": "2.2.5",
|
||||
"@cypress/vite-dev-server": "5.2.0",
|
||||
"@cypress/vue": "6.0.1",
|
||||
"@faker-js/faker": "9.2.0",
|
||||
"@cypress/vite-dev-server": "6.0.1",
|
||||
"@cypress/vue": "6.0.2",
|
||||
"@faker-js/faker": "9.4.0",
|
||||
"@histoire/plugin-screenshot": "0.17.17",
|
||||
"@histoire/plugin-vue": "0.17.17",
|
||||
"@tsconfig/node22": "22.0.0",
|
||||
"@types/codemirror": "5.60.15",
|
||||
"@types/dompurify": "3.0.5",
|
||||
"@types/flexsearch": "0.7.6",
|
||||
"@types/is-touch-device": "1.0.3",
|
||||
"@types/lodash.clonedeep": "4.5.9",
|
||||
"@types/node": "22.9.0",
|
||||
"@types/node": "22.10.7",
|
||||
"@types/sortablejs": "1.15.8",
|
||||
"@typescript-eslint/eslint-plugin": "8.14.0",
|
||||
"@typescript-eslint/parser": "8.14.0",
|
||||
"@vitejs/plugin-legacy": "5.4.3",
|
||||
"@vitejs/plugin-vue": "5.2.0",
|
||||
"@vue/eslint-config-typescript": "14.1.3",
|
||||
"@typescript-eslint/eslint-plugin": "8.20.0",
|
||||
"@typescript-eslint/parser": "8.20.0",
|
||||
"@vitejs/plugin-vue": "5.2.1",
|
||||
"@vue/eslint-config-typescript": "14.3.0",
|
||||
"@vue/test-utils": "2.4.6",
|
||||
"@vue/tsconfig": "0.6.0",
|
||||
"@vue/tsconfig": "0.7.0",
|
||||
"autoprefixer": "10.4.20",
|
||||
"browserslist": "4.24.2",
|
||||
"caniuse-lite": "1.0.30001680",
|
||||
"browserslist": "4.24.4",
|
||||
"caniuse-lite": "1.0.30001692",
|
||||
"csstype": "3.1.3",
|
||||
"cypress": "13.15.2",
|
||||
"esbuild": "0.24.0",
|
||||
"eslint": "9.14.0",
|
||||
"eslint-plugin-vue": "9.31.0",
|
||||
"happy-dom": "15.11.6",
|
||||
"cypress": "14.0.0",
|
||||
"esbuild": "0.24.2",
|
||||
"eslint": "9.18.0",
|
||||
"eslint-plugin-vue": "9.32.0",
|
||||
"happy-dom": "16.6.0",
|
||||
"histoire": "0.17.17",
|
||||
"postcss": "8.4.49",
|
||||
"postcss": "8.5.1",
|
||||
"postcss-easing-gradients": "3.0.1",
|
||||
"postcss-preset-env": "10.1.0",
|
||||
"rollup": "4.26.0",
|
||||
"rollup-plugin-visualizer": "5.12.0",
|
||||
"sass-embedded": "1.81.0",
|
||||
"start-server-and-test": "2.0.8",
|
||||
"typescript": "5.6.3",
|
||||
"postcss-preset-env": "10.1.3",
|
||||
"rollup": "4.30.1",
|
||||
"rollup-plugin-visualizer": "5.14.0",
|
||||
"sass-embedded": "1.83.4",
|
||||
"start-server-and-test": "2.0.10",
|
||||
"typescript": "5.7.3",
|
||||
"unplugin-inject-preload": "3.0.0",
|
||||
"vite": "5.4.11",
|
||||
"vite-plugin-pwa": "0.21.0",
|
||||
"vite": "6.0.7",
|
||||
"vite-plugin-pwa": "0.21.1",
|
||||
"vite-plugin-sentry": "1.4.0",
|
||||
"vite-plugin-vue-devtools": "7.7.0",
|
||||
"vite-svg-loader": "5.1.0",
|
||||
"vitest": "2.1.5",
|
||||
"vue-tsc": "2.1.10",
|
||||
"wait-on": "8.0.1",
|
||||
"vitest": "3.0.1",
|
||||
"vue-tsc": "2.2.0",
|
||||
"wait-on": "8.0.2",
|
||||
"workbox-cli": "7.3.0"
|
||||
},
|
||||
"pnpm": {
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<template>
|
||||
<Ready>
|
||||
<template v-if="authUser">
|
||||
<template v-if="authStore.authUser">
|
||||
<AppHeader />
|
||||
<ContentAuth />
|
||||
</template>
|
||||
<ContentLinkShare v-else-if="authLinkShare" />
|
||||
<ContentLinkShare v-else-if="authStore.authLinkShare" />
|
||||
<NoAuthWrapper v-else>
|
||||
<RouterView />
|
||||
</NoAuthWrapper>
|
||||
@@ -49,17 +49,15 @@ import DemoMode from '@/components/home/DemoMode.vue'
|
||||
const importAccountDeleteService = () => import('@/services/accountDelete')
|
||||
import {success} from '@/message'
|
||||
|
||||
const baseStore = useBaseStore()
|
||||
const authStore = useAuthStore()
|
||||
const baseStore = useBaseStore()
|
||||
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
|
||||
useBodyClass('is-touch', isTouchDevice())
|
||||
const keyboardShortcutsActive = computed(() => baseStore.keyboardShortcutsActive)
|
||||
|
||||
const authUser = computed(() => authStore.authUser)
|
||||
const authLinkShare = computed(() => authStore.authLinkShare)
|
||||
|
||||
const {t} = useI18n({useScope: 'global'})
|
||||
|
||||
// setup account deletion verification
|
||||
|
||||
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 471 B After Width: | Height: | Size: 471 B |
|
Before Width: | Height: | Size: 745 B After Width: | Height: | Size: 745 B |
|
Before Width: | Height: | Size: 512 B After Width: | Height: | Size: 512 B |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.9 KiB |
@@ -112,7 +112,7 @@ import Popup from '@/components/misc/Popup.vue'
|
||||
import {DATE_RANGES} from '@/components/date/dateRanges'
|
||||
import BaseButton from '@/components/base/BaseButton.vue'
|
||||
import DatemathHelp from '@/components/date/DatemathHelp.vue'
|
||||
import {getFlatpickrLanguage} from '@/helpers/flatpickrLanguage'
|
||||
import {useFlatpickrLanguage} from '@/helpers/useFlatpickrLanguage'
|
||||
|
||||
const props = defineProps<{
|
||||
modelValue: {
|
||||
@@ -137,7 +137,7 @@ const flatPickerConfig = computed(() => ({
|
||||
enableTime: false,
|
||||
wrap: true,
|
||||
mode: 'range',
|
||||
locale: getFlatpickrLanguage(),
|
||||
locale: useFlatpickrLanguage().value,
|
||||
}))
|
||||
|
||||
const showHowItWorks = ref(false)
|
||||
|
||||
@@ -89,7 +89,7 @@ import Popup from '@/components/misc/Popup.vue'
|
||||
import {DATE_VALUES} from '@/components/date/dateRanges'
|
||||
import BaseButton from '@/components/base/BaseButton.vue'
|
||||
import DatemathHelp from '@/components/date/DatemathHelp.vue'
|
||||
import {getFlatpickrLanguage} from '@/helpers/flatpickrLanguage'
|
||||
import {useFlatpickrLanguage} from '@/helpers/useFlatpickrLanguage'
|
||||
|
||||
const props = withDefaults(defineProps<{
|
||||
modelValue: string | Date | null,
|
||||
@@ -112,7 +112,7 @@ const flatPickerConfig = computed(() => ({
|
||||
dateFormat: 'Y-m-d H:i',
|
||||
enableTime: false,
|
||||
wrap: true,
|
||||
locale: getFlatpickrLanguage(),
|
||||
locale: useFlatpickrLanguage().value,
|
||||
}))
|
||||
|
||||
const showHowItWorks = ref(false)
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
</h1>
|
||||
|
||||
<BaseButton
|
||||
v-if="!isEditorContentEmpty(currentProject.description)"
|
||||
:to="{ name: 'project.info', params: { projectId: currentProject.id } }"
|
||||
class="project-title-button"
|
||||
>
|
||||
@@ -124,6 +125,7 @@ import MenuButton from '@/components/home/MenuButton.vue'
|
||||
import OpenQuickActions from '@/components/misc/OpenQuickActions.vue'
|
||||
|
||||
import { getProjectTitle } from '@/helpers/getProjectTitle'
|
||||
import { isEditorContentEmpty } from '@/helpers/editorContentEmpty'
|
||||
|
||||
import { useBaseStore } from '@/stores/base'
|
||||
import { useConfigStore } from '@/stores/config'
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
v-slot="{ Component }"
|
||||
:route="routeWithModal"
|
||||
>
|
||||
<keep-alive :include="['project.view']">
|
||||
<keep-alive :include="['project']">
|
||||
<component :is="Component" />
|
||||
</keep-alive>
|
||||
</RouterView>
|
||||
|
||||
@@ -28,7 +28,7 @@ const enabled = computed(() => configStore.demoModeEnabled && !hide.value)
|
||||
|
||||
<style scoped lang="scss">
|
||||
.demo-mode-banner {
|
||||
position: sticky;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
inset-inline: 0;
|
||||
background: var(--danger);
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
/>
|
||||
</BaseButton>
|
||||
<BaseButton
|
||||
:to="{ name: 'project.index', params: { projectId: project.id} }"
|
||||
:to="{ name: 'project', params: { projectId: project.id} }"
|
||||
class="list-menu-link"
|
||||
:class="{'router-link-exact-active': currentProject?.id === project.id}"
|
||||
>
|
||||
|
||||
@@ -82,7 +82,7 @@ import {calculateDayInterval} from '@/helpers/time/calculateDayInterval'
|
||||
import {calculateNearestHours} from '@/helpers/time/calculateNearestHours'
|
||||
import {createDateFromString} from '@/helpers/time/createDateFromString'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {getFlatpickrLanguage} from '@/helpers/flatpickrLanguage'
|
||||
import {useFlatpickrLanguage} from '@/helpers/useFlatpickrLanguage'
|
||||
|
||||
const props = withDefaults(defineProps<{
|
||||
modelValue: Date | null | string
|
||||
@@ -114,7 +114,7 @@ const flatPickerConfig = computed(() => ({
|
||||
enableTime: true,
|
||||
time_24hr: true,
|
||||
inline: true,
|
||||
locale: getFlatpickrLanguage(),
|
||||
locale: useFlatpickrLanguage().value,
|
||||
}))
|
||||
|
||||
// Since flatpickr dates are strings, we need to convert them to native date objects.
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
<script setup lang="ts" generic="T extends { [id: string]: any }">
|
||||
import {computed, onBeforeUnmount, onMounted, ref, toRefs, watch, type ComponentPublicInstance} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
|
||||
@@ -134,15 +134,13 @@ import CustomTransition from '@/components/misc/CustomTransition.vue'
|
||||
|
||||
const props = withDefaults(defineProps<{
|
||||
/** The object with the value, updated every time an entry is selected */
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
modelValue: { [id: string]: any } | null
|
||||
modelValue: T | T[] | null,
|
||||
/** When true, shows a loading spinner */
|
||||
loading?: boolean
|
||||
/** The placeholder of the search input */
|
||||
placeholder?: string
|
||||
/** The search results where the @search listener needs to put the results into */
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
searchResults?: { [id: string]: any }[]
|
||||
searchResults?: T[]
|
||||
/** The name of the property of the searched object to show the user. If empty the component will show all raw data of an entry */
|
||||
label?: string
|
||||
/** The id attribute of the input element */
|
||||
@@ -188,8 +186,7 @@ const props = withDefaults(defineProps<{
|
||||
})
|
||||
|
||||
const emit = defineEmits<{
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
'update:modelValue': [value: { [key: string]: any }[] | null],
|
||||
'update:modelValue': [value: T | T[] | null],
|
||||
/**
|
||||
* Triggered every time the search query input changes
|
||||
*/
|
||||
@@ -197,8 +194,7 @@ const emit = defineEmits<{
|
||||
/**
|
||||
* Triggered every time an option from the search results is selected. Also triggers a change in v-model.
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
'select': [value: { [key: string]: any }],
|
||||
'select': [value: T],
|
||||
/**
|
||||
* If nothing or no exact match was found and `creatable` is true, this event is triggered with the current value of the search query.
|
||||
*/
|
||||
@@ -206,8 +202,7 @@ const emit = defineEmits<{
|
||||
/**
|
||||
* If `multiple` is enabled, this will be fired every time an item is removed from the array of selected items.
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
'remove': [value: { [key: string]: any }],
|
||||
'remove': [value: T],
|
||||
}>()
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
@@ -220,13 +215,12 @@ function elementInResults(elem: string | any, label: string, query: string): boo
|
||||
return elem === query
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const query = ref<string | { [key: string]: any }>('')
|
||||
const query = ref<string | T>('')
|
||||
const searchTimeout = ref<ReturnType<typeof setTimeout> | null>(null)
|
||||
const localLoading = ref(false)
|
||||
const showSearchResults = ref(false)
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const internalValue = ref<string | { [key: string]: any } | any[] | null>(null)
|
||||
|
||||
const internalValue = ref<string | T | T[] | null>(null)
|
||||
|
||||
onMounted(() => document.addEventListener('click', hideSearchResultsHandler))
|
||||
onBeforeUnmount(() => document.removeEventListener('click', hideSearchResultsHandler))
|
||||
@@ -325,15 +319,13 @@ function handleFocus() {
|
||||
}, 10)
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
function select(object: { [key: string]: any } | null) {
|
||||
function select(object: T | null) {
|
||||
if (props.multiple) {
|
||||
if (internalValue.value === null) {
|
||||
internalValue.value = []
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
(internalValue.value as any[]).push(object)
|
||||
internalValue.value.push(object)
|
||||
} else {
|
||||
internalValue.value = object
|
||||
}
|
||||
@@ -346,8 +338,7 @@ function select(object: { [key: string]: any } | null) {
|
||||
}
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
function setSelectedObject(object: string | { [id: string]: any } | null, resetOnly = false) {
|
||||
function setSelectedObject(object: string | T | null, resetOnly = false) {
|
||||
internalValue.value = object
|
||||
|
||||
// We assume we're getting an array when multiple is enabled and can therefore leave the query
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
v-tooltip="$t('input.editor.bold')"
|
||||
class="editor-bubble__button"
|
||||
:class="{ 'is-active': editor.isActive('bold') }"
|
||||
@click="editor.chain().focus().toggleBold().run()"
|
||||
@click="() => editor?.chain().focus().toggleBold().run()"
|
||||
>
|
||||
<Icon :icon="['fa', 'fa-bold']" />
|
||||
</BaseButton>
|
||||
@@ -25,7 +25,7 @@
|
||||
v-tooltip="$t('input.editor.italic')"
|
||||
class="editor-bubble__button"
|
||||
:class="{ 'is-active': editor.isActive('italic') }"
|
||||
@click="editor.chain().focus().toggleItalic().run()"
|
||||
@click="() => editor?.chain().focus().toggleItalic().run()"
|
||||
>
|
||||
<Icon :icon="['fa', 'fa-italic']" />
|
||||
</BaseButton>
|
||||
@@ -33,7 +33,7 @@
|
||||
v-tooltip="$t('input.editor.underline')"
|
||||
class="editor-bubble__button"
|
||||
:class="{ 'is-active': editor.isActive('underline') }"
|
||||
@click="editor.chain().focus().toggleUnderline().run()"
|
||||
@click="() => editor?.chain().focus().toggleUnderline().run()"
|
||||
>
|
||||
<Icon :icon="['fa', 'fa-underline']" />
|
||||
</BaseButton>
|
||||
@@ -41,7 +41,7 @@
|
||||
v-tooltip="$t('input.editor.strikethrough')"
|
||||
class="editor-bubble__button"
|
||||
:class="{ 'is-active': editor.isActive('strike') }"
|
||||
@click="editor.chain().focus().toggleStrike().run()"
|
||||
@click="() => editor?.chain().focus().toggleStrike().run()"
|
||||
>
|
||||
<Icon :icon="['fa', 'fa-strikethrough']" />
|
||||
</BaseButton>
|
||||
@@ -49,7 +49,7 @@
|
||||
v-tooltip="$t('input.editor.code')"
|
||||
class="editor-bubble__button"
|
||||
:class="{ 'is-active': editor.isActive('code') }"
|
||||
@click="editor.chain().focus().toggleCode().run()"
|
||||
@click="() => editor?.chain().focus().toggleCode().run()"
|
||||
>
|
||||
<Icon :icon="['fa', 'fa-code']" />
|
||||
</BaseButton>
|
||||
@@ -87,7 +87,7 @@
|
||||
<li>
|
||||
<BaseButton
|
||||
class="done-edit"
|
||||
@click="setEdit"
|
||||
@click="() => setEdit()"
|
||||
>
|
||||
{{ $t('input.editor.edit') }}
|
||||
</BaseButton>
|
||||
@@ -108,7 +108,7 @@
|
||||
<li v-if="!isEditing">
|
||||
<BaseButton
|
||||
class="done-edit"
|
||||
@click="setEdit"
|
||||
@click="() => setEdit()"
|
||||
>
|
||||
{{ $t('input.editor.edit') }}
|
||||
</BaseButton>
|
||||
@@ -138,11 +138,16 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import {computed, nextTick, onBeforeUnmount, onMounted, ref, watch} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {eventToHotkeyString} from '@github/hotkey'
|
||||
|
||||
import EditorToolbar from './EditorToolbar.vue'
|
||||
|
||||
import Link from '@tiptap/extension-link'
|
||||
import StarterKit from '@tiptap/starter-kit'
|
||||
import {Extension, mergeAttributes} from '@tiptap/core'
|
||||
import {BubbleMenu, EditorContent, type Extensions, useEditor} from '@tiptap/vue-3'
|
||||
|
||||
import Link from '@tiptap/extension-link'
|
||||
import CodeBlockLowlight from '@tiptap/extension-code-block-lowlight'
|
||||
import Table from '@tiptap/extension-table'
|
||||
import TableCell from '@tiptap/extension-table-cell'
|
||||
@@ -151,46 +156,27 @@ import TableRow from '@tiptap/extension-table-row'
|
||||
import Typography from '@tiptap/extension-typography'
|
||||
import Image from '@tiptap/extension-image'
|
||||
import Underline from '@tiptap/extension-underline'
|
||||
import {Placeholder} from '@tiptap/extension-placeholder'
|
||||
|
||||
import TaskItem from '@tiptap/extension-task-item'
|
||||
import TaskList from '@tiptap/extension-task-list'
|
||||
import HardBreak from '@tiptap/extension-hard-break'
|
||||
|
||||
import {Blockquote} from '@tiptap/extension-blockquote'
|
||||
import {Bold} from '@tiptap/extension-bold'
|
||||
import {BulletList} from '@tiptap/extension-bullet-list'
|
||||
import {Code} from '@tiptap/extension-code'
|
||||
import {Document} from '@tiptap/extension-document'
|
||||
import {Dropcursor} from '@tiptap/extension-dropcursor'
|
||||
import {Gapcursor} from '@tiptap/extension-gapcursor'
|
||||
import {HardBreak} from '@tiptap/extension-hard-break'
|
||||
import {Heading} from '@tiptap/extension-heading'
|
||||
import {History} from '@tiptap/extension-history'
|
||||
import {HorizontalRule} from '@tiptap/extension-horizontal-rule'
|
||||
import {Italic} from '@tiptap/extension-italic'
|
||||
import {ListItem} from '@tiptap/extension-list-item'
|
||||
import {OrderedList} from '@tiptap/extension-ordered-list'
|
||||
import {Paragraph} from '@tiptap/extension-paragraph'
|
||||
import {Strike} from '@tiptap/extension-strike'
|
||||
import {Text} from '@tiptap/extension-text'
|
||||
import {BubbleMenu, EditorContent, type Extensions, useEditor} from '@tiptap/vue-3'
|
||||
import {Node} from '@tiptap/pm/model'
|
||||
|
||||
import Commands from './commands'
|
||||
import suggestionSetup from './suggestion'
|
||||
|
||||
import {lowlight} from 'lowlight'
|
||||
import {common, createLowlight} from 'lowlight'
|
||||
|
||||
import type {BottomAction, UploadCallback} from './types'
|
||||
import type {ITask} from '@/modelTypes/ITask'
|
||||
import type {IAttachment} from '@/modelTypes/IAttachment'
|
||||
import AttachmentModel from '@/models/attachment'
|
||||
import AttachmentService from '@/services/attachment'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import BaseButton from '@/components/base/BaseButton.vue'
|
||||
import XButton from '@/components/input/Button.vue'
|
||||
import {Placeholder} from '@tiptap/extension-placeholder'
|
||||
import {eventToHotkeyString} from '@github/hotkey'
|
||||
import {Extension, mergeAttributes} from '@tiptap/core'
|
||||
|
||||
import {isEditorContentEmpty} from '@/helpers/editorContentEmpty'
|
||||
import inputPrompt from '@/helpers/inputPrompt'
|
||||
import {setLinkInEditor} from '@/components/input/editor/setLinkInEditor'
|
||||
@@ -351,16 +337,14 @@ const additionalLinkProtocols = [
|
||||
|
||||
const extensions : Extensions = [
|
||||
// Starterkit:
|
||||
Blockquote,
|
||||
Bold,
|
||||
BulletList,
|
||||
Code,
|
||||
StarterKit.configure({
|
||||
codeBlock: false,
|
||||
hardBreak: false,
|
||||
}),
|
||||
|
||||
CodeBlockLowlight.configure({
|
||||
lowlight,
|
||||
lowlight: createLowlight(common),
|
||||
}),
|
||||
Document,
|
||||
Dropcursor,
|
||||
Gapcursor,
|
||||
HardBreak.extend({
|
||||
addKeyboardShortcuts() {
|
||||
return {
|
||||
@@ -374,15 +358,6 @@ const extensions : Extensions = [
|
||||
}
|
||||
},
|
||||
}),
|
||||
Heading,
|
||||
History,
|
||||
HorizontalRule,
|
||||
Italic,
|
||||
ListItem,
|
||||
OrderedList,
|
||||
Paragraph,
|
||||
Strike,
|
||||
Text,
|
||||
|
||||
Placeholder.configure({
|
||||
placeholder: ({editor}) => {
|
||||
@@ -451,7 +426,6 @@ const extensions : Extensions = [
|
||||
Commands.configure({
|
||||
suggestion: suggestionSetup(t),
|
||||
}),
|
||||
BubbleMenu,
|
||||
]
|
||||
|
||||
// Add a custom extension for the Escape key
|
||||
|
||||
@@ -15,12 +15,12 @@
|
||||
<p>{{ $t('offline.text') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<template v-else-if="ready">
|
||||
<template v-else-if="baseStore.ready">
|
||||
<slot />
|
||||
</template>
|
||||
<section v-else-if="error !== ''">
|
||||
<section v-else-if="baseStore.error !== ''">
|
||||
<NoAuthWrapper :show-api-config="false">
|
||||
<p v-if="error === ERROR_NO_API_URL">
|
||||
<p v-if="baseStore.error === ERROR_NO_API_URL">
|
||||
{{ $t('ready.noApiUrlConfigured') }}
|
||||
</p>
|
||||
<Message
|
||||
@@ -30,7 +30,7 @@
|
||||
>
|
||||
<p>
|
||||
{{ $t('ready.errorOccured') }}<br>
|
||||
{{ error }}
|
||||
{{ baseStore.error }}
|
||||
</p>
|
||||
<p>
|
||||
{{ $t('ready.checkApiUrl') }}
|
||||
@@ -38,13 +38,13 @@
|
||||
</Message>
|
||||
<ApiConfig
|
||||
:configure-open="true"
|
||||
@foundApi="load"
|
||||
@foundApi="baseStore.loadApp()"
|
||||
/>
|
||||
</NoAuthWrapper>
|
||||
</section>
|
||||
<CustomTransition name="fade">
|
||||
<section
|
||||
v-if="showLoading"
|
||||
v-if="baseStore.loading"
|
||||
class="vikunja-loading"
|
||||
>
|
||||
<Logo class="logo" />
|
||||
@@ -57,60 +57,19 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import {ref, computed} from 'vue'
|
||||
import {useRouter, useRoute} from 'vue-router'
|
||||
|
||||
import Logo from '@/assets/logo.svg?component'
|
||||
import ApiConfig from '@/components/misc/ApiConfig.vue'
|
||||
import Message from '@/components/misc/Message.vue'
|
||||
import CustomTransition from '@/components/misc/CustomTransition.vue'
|
||||
import NoAuthWrapper from '@/components/misc/NoAuthWrapper.vue'
|
||||
|
||||
import {ERROR_NO_API_URL, InvalidApiUrlProvidedError, NoApiUrlProvidedError} from '@/helpers/checkAndSetApiUrl'
|
||||
import {ERROR_NO_API_URL} from '@/helpers/checkAndSetApiUrl'
|
||||
|
||||
import {useOnline} from '@/composables/useOnline'
|
||||
|
||||
import {getAuthForRoute} from '@/router'
|
||||
|
||||
import {useBaseStore} from '@/stores/base'
|
||||
import {useAuthStore} from '@/stores/auth'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
|
||||
const baseStore = useBaseStore()
|
||||
const authStore = useAuthStore()
|
||||
|
||||
const ready = computed(() => baseStore.ready)
|
||||
const online = useOnline()
|
||||
|
||||
const error = ref('')
|
||||
const showLoading = computed(() => !ready.value && error.value === '')
|
||||
|
||||
const {t} = useI18n()
|
||||
|
||||
async function load() {
|
||||
try {
|
||||
await baseStore.loadApp()
|
||||
baseStore.setReady(true)
|
||||
const redirectTo = await getAuthForRoute(route, authStore)
|
||||
if (typeof redirectTo !== 'undefined') {
|
||||
await router.push(redirectTo)
|
||||
}
|
||||
} catch (e: unknown) {
|
||||
if (e instanceof NoApiUrlProvidedError) {
|
||||
error.value = ERROR_NO_API_URL
|
||||
return
|
||||
}
|
||||
if (e instanceof InvalidApiUrlProvidedError) {
|
||||
error.value = t('apiConfig.error')
|
||||
return
|
||||
}
|
||||
error.value = String(e.message)
|
||||
}
|
||||
}
|
||||
|
||||
load()
|
||||
const baseStore = useBaseStore()
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
@@ -62,29 +62,22 @@ export default {inheritAttrs: false}
|
||||
</script>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {computed, onBeforeUnmount, onMounted, ref, toRefs, useAttrs, watch, watchEffect, type PropType} from 'vue'
|
||||
import {computed, onBeforeUnmount, onMounted, ref, toRefs, useAttrs, watch, watchEffect} from 'vue'
|
||||
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: [String, Number, Date, Array] as PropType<DateOption | DateOption[] | null>,
|
||||
default: null,
|
||||
},
|
||||
// https://flatpickr.js.org/options/
|
||||
config: {
|
||||
type: Object as PropType<Options>,
|
||||
default: () => ({
|
||||
defaultDate: null,
|
||||
wrap: false,
|
||||
}),
|
||||
},
|
||||
events: {
|
||||
type: Array as PropType<HookKey[]>,
|
||||
default: () => includedEvents,
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
const props = withDefaults(defineProps<{
|
||||
modelValue: DateOption | DateOption[] | null,
|
||||
/** https://flatpickr.js.org/options/ */
|
||||
config: Options,
|
||||
events: HookKey[],
|
||||
disabled: boolean,
|
||||
}>(), {
|
||||
modelValue: null,
|
||||
config: () => ({
|
||||
defaultDate: undefined,
|
||||
wrap: false,
|
||||
}),
|
||||
events: () => includedEvents,
|
||||
disabled: false,
|
||||
})
|
||||
|
||||
const emit = defineEmits([
|
||||
|
||||
@@ -62,7 +62,7 @@ export const KEYBOARD_SHORTCUTS : ShortcutGroup[] = [
|
||||
},
|
||||
{
|
||||
title: 'project.kanban.title',
|
||||
available: (route) => route.name === 'project.view',
|
||||
available: (route) => route.name === 'project',
|
||||
shortcuts: [
|
||||
{
|
||||
title: 'keyboardShortcuts.task.done',
|
||||
|
||||
@@ -159,6 +159,7 @@ function to(n, index) {
|
||||
case names.TASK_COMMENT:
|
||||
case names.TASK_ASSIGNED:
|
||||
case names.TASK_REMINDER:
|
||||
case names.TASK_MENTIONED:
|
||||
to.name = 'task.detail'
|
||||
to.params.id = n.notification.task.id
|
||||
break
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
{{ $t('project.webhooks.title') }}
|
||||
</DropdownItem>
|
||||
<DropdownItem
|
||||
:to="{ name: 'project.createFromParent', params: { parentProjectId: project.id } }"
|
||||
:to="{ name: 'project.create', params: { parentProjectId: project.id } }"
|
||||
icon="layer-group"
|
||||
>
|
||||
{{ $t('menu.createProject') }}
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
:key="view.id"
|
||||
class="switch-view-button"
|
||||
:class="{'is-active': view.id === viewId}"
|
||||
:to="{ name: 'project.view', params: { projectId, viewId: view.id } }"
|
||||
:to="{ name: 'project', params: { projectId, viewId: view.id } }"
|
||||
>
|
||||
{{ getViewTitle(view) }}
|
||||
</BaseButton>
|
||||
@@ -42,7 +42,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {computed, ref, watch} from 'vue'
|
||||
import {computed, ref, shallowReactive, watch, watchEffect} from 'vue'
|
||||
import {useRoute} from 'vue-router'
|
||||
|
||||
import BaseButton from '@/components/base/BaseButton.vue'
|
||||
@@ -72,7 +72,7 @@ const {t} = useI18n()
|
||||
|
||||
const baseStore = useBaseStore()
|
||||
const projectStore = useProjectStore()
|
||||
const projectService = ref(new ProjectService())
|
||||
const projectService = shallowReactive(new ProjectService())
|
||||
const loadedProjectId = ref(0)
|
||||
|
||||
const currentProject = computed<IProject>(() => {
|
||||
@@ -96,8 +96,7 @@ watch(
|
||||
() => props.projectId,
|
||||
// loadProject
|
||||
async (projectIdToLoad: number) => {
|
||||
const projectData = {id: projectIdToLoad}
|
||||
saveProjectToHistory(projectData)
|
||||
saveProjectToHistory({id: projectIdToLoad})
|
||||
|
||||
// Don't load the project if we either already loaded it or aren't dealing with a project at all currently and
|
||||
// the currently loaded project has the right set.
|
||||
@@ -117,15 +116,15 @@ watch(
|
||||
|
||||
// Set the current project to the one we're about to load so that the title is already shown at the top
|
||||
loadedProjectId.value = 0
|
||||
const projectFromStore = projectStore.projects[projectData.id]
|
||||
const projectFromStore = projectStore.projects[projectIdToLoad]
|
||||
if (projectFromStore) {
|
||||
baseStore.handleSetCurrentProject({project: projectFromStore, currentProjectViewId: props.viewId})
|
||||
}
|
||||
|
||||
// We create an extra project object instead of creating it in project.value because that would trigger a ui update which would result in bad ux.
|
||||
const project = new ProjectModel(projectData)
|
||||
const project = new ProjectModel({id: projectIdToLoad})
|
||||
try {
|
||||
const loadedProject = await projectService.value.get(project)
|
||||
const loadedProject = await projectService.get(project)
|
||||
baseStore.handleSetCurrentProject({project: loadedProject, currentProjectViewId: props.viewId})
|
||||
} finally {
|
||||
loadedProjectId.value = projectIdToLoad
|
||||
@@ -134,13 +133,7 @@ watch(
|
||||
{immediate: true},
|
||||
)
|
||||
|
||||
watch(
|
||||
() => props.viewId,
|
||||
() => {
|
||||
baseStore.setCurrentProjectViewId(props.viewId)
|
||||
},
|
||||
{immediate: true},
|
||||
)
|
||||
watchEffect(() => baseStore.setCurrentProjectViewId(props.viewId))
|
||||
|
||||
function getViewTitle(view: IProjectView) {
|
||||
switch (view.title) {
|
||||
|
||||
@@ -87,7 +87,7 @@ const filterFromView = computed(() => {
|
||||
return
|
||||
}
|
||||
const view = project.views.find(v => v.id === props.viewId)
|
||||
return view?.filter
|
||||
return view?.filter?.filter
|
||||
})
|
||||
</script>
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
:aria-label="project.title"
|
||||
:title="textOnlyDescription"
|
||||
:to="{
|
||||
name: 'project.index',
|
||||
name: 'project',
|
||||
params: { projectId: project.id}
|
||||
}"
|
||||
/>
|
||||
|
||||
@@ -77,7 +77,7 @@ import {useI18n} from 'vue-i18n'
|
||||
import type {RouteLocationNormalized} from 'vue-router'
|
||||
|
||||
import {useBaseStore} from '@/stores/base'
|
||||
import {getFlatpickrLanguage} from '@/helpers/flatpickrLanguage'
|
||||
import {useFlatpickrLanguage} from '@/helpers/useFlatpickrLanguage'
|
||||
|
||||
import Foo from '@/components/misc/flatpickr/Flatpickr.vue'
|
||||
import ProjectWrapper from '@/components/project/ProjectWrapper.vue'
|
||||
@@ -85,7 +85,7 @@ import FancyCheckbox from '@/components/input/FancyCheckbox.vue'
|
||||
import TaskForm from '@/components/tasks/TaskForm.vue'
|
||||
|
||||
import {createAsyncComponent} from '@/helpers/createAsyncComponent'
|
||||
import {useGanttFilters} from '../../../views/project/helpers/useGanttFilters'
|
||||
import {useGanttFilters} from '@/composables/useGanttFilters'
|
||||
import {RIGHTS} from '@/constants/rights'
|
||||
|
||||
import type {DateISO} from '@/types/DateISO'
|
||||
@@ -153,14 +153,14 @@ const flatPickerDateRange = computed<Date[]>({
|
||||
const initialDateRange = [filters.value.dateFrom, filters.value.dateTo]
|
||||
|
||||
const {t} = useI18n({useScope: 'global'})
|
||||
const flatPickerConfig = computed<Options>(() => ({
|
||||
const flatPickerConfig = computed(() => ({
|
||||
altFormat: t('date.altFormatShort'),
|
||||
altInput: true,
|
||||
defaultDate: initialDateRange,
|
||||
enableTime: false,
|
||||
mode: 'range',
|
||||
locale: getFlatpickrLanguage(),
|
||||
}))
|
||||
locale: useFlatpickrLanguage().value,
|
||||
} as Options))
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
@@ -191,10 +191,12 @@
|
||||
</div>
|
||||
<x-button
|
||||
v-else
|
||||
v-tooltip="bucket.limit > 0 && bucket.count >= bucket.limit ? $t('project.kanban.bucketLimitReached') : ''"
|
||||
class="is-fullwidth has-text-centered"
|
||||
:shadow="false"
|
||||
icon="plus"
|
||||
variant="secondary"
|
||||
:disabled="bucket.limit > 0 && bucket.count >= bucket.limit"
|
||||
@click="toggleShowNewTaskInput(bucket.id)"
|
||||
>
|
||||
{{
|
||||
@@ -569,7 +571,6 @@ async function addTaskToBucket(bucketId: IBucket['id']) {
|
||||
bucketId,
|
||||
projectId: project.value.id,
|
||||
})
|
||||
toggleShowNewTaskInput(bucketId)
|
||||
newTaskText.value = ''
|
||||
kanbanStore.addTaskToBucket(task)
|
||||
scrollTaskContainerToTop(bucketId)
|
||||
@@ -975,4 +976,4 @@ $filter-container-height: '1rem - #{$switch-view-height}';
|
||||
.move-card-leave-active {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@@ -37,14 +37,13 @@
|
||||
<Nothing v-if="ctaVisible && tasks.length === 0 && !loading">
|
||||
{{ $t('project.list.empty') }}
|
||||
<ButtonLink
|
||||
v-if="project.id > 0"
|
||||
v-if="project.id > 0 && canWrite"
|
||||
@click="focusNewTaskInput()"
|
||||
>
|
||||
{{ $t('project.list.newTaskCta') }}
|
||||
</ButtonLink>
|
||||
</Nothing>
|
||||
|
||||
|
||||
<draggable
|
||||
v-if="tasks && tasks.length > 0"
|
||||
v-model="tasks"
|
||||
@@ -140,7 +139,14 @@ const {
|
||||
loadTasks,
|
||||
params,
|
||||
sortByParam,
|
||||
} = useTaskList(() => props.projectId, () => props.viewId, {position: 'asc'})
|
||||
} = useTaskList(
|
||||
() => props.projectId,
|
||||
() => props.viewId,
|
||||
{position: 'asc'},
|
||||
() => props.projectId === -1
|
||||
? null
|
||||
: 'subtasks',
|
||||
)
|
||||
|
||||
const taskPositionService = ref(new TaskPositionService())
|
||||
|
||||
|
||||
@@ -449,7 +449,7 @@ async function doAction(type: ACTION_TYPE, item: DoAction) {
|
||||
case ACTION_TYPE.PROJECT:
|
||||
closeQuickActions()
|
||||
await router.push({
|
||||
name: 'project.index',
|
||||
name: 'project',
|
||||
params: {projectId: (item as DoAction<IProject>).id},
|
||||
})
|
||||
break
|
||||
|
||||
@@ -100,7 +100,9 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th />
|
||||
<th>{{ $t('project.share.links.view') }}</th>
|
||||
<th v-if="availableViews.length > 0">
|
||||
{{ $t('project.share.links.view') }}
|
||||
</th>
|
||||
<th>{{ $t('project.share.attributes.delete') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -150,7 +152,7 @@
|
||||
<div class="field has-addons no-input-mobile">
|
||||
<div class="control">
|
||||
<input
|
||||
:value="getShareLink(s.hash, selectedView[s.id])"
|
||||
:value="shareLinks[s.id]"
|
||||
class="input"
|
||||
readonly
|
||||
type="text"
|
||||
@@ -160,7 +162,7 @@
|
||||
<x-button
|
||||
v-tooltip="$t('misc.copy')"
|
||||
:shadow="false"
|
||||
@click="copy(getShareLink(s.hash, selectedView[s.id]))"
|
||||
@click="copy(shareLinks[s.id])"
|
||||
>
|
||||
<span class="icon">
|
||||
<Icon icon="paste" />
|
||||
@@ -169,9 +171,9 @@
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<td v-if="availableViews.length > 0">
|
||||
<div class="select">
|
||||
<select v-model="selectedView[s.id]">
|
||||
<select v-model="selectedViews[s.id]">
|
||||
<option
|
||||
v-for="(view) in availableViews"
|
||||
:key="view.id"
|
||||
@@ -251,10 +253,6 @@ const showDeleteModal = ref(false)
|
||||
const linkIdToDelete = ref(0)
|
||||
const showNewForm = ref(false)
|
||||
|
||||
type SelectedViewMapper = Record<IProject['id'], IProjectView['id']>
|
||||
|
||||
const selectedView = ref<SelectedViewMapper>({})
|
||||
|
||||
const projectStore = useProjectStore()
|
||||
|
||||
const availableViews = computed<IProjectView[]>(() => projectStore.projects[props.projectId]?.views || [])
|
||||
@@ -274,13 +272,28 @@ async function load(projectId: IProject['id']) {
|
||||
return
|
||||
}
|
||||
|
||||
const links = await linkShareService.getAll({projectId})
|
||||
links.forEach((l: ILinkShare) => {
|
||||
selectedView.value[l.id] = availableViews.value[0].id
|
||||
})
|
||||
linkShares.value = links
|
||||
linkShares.value = await linkShareService.getAll({projectId})
|
||||
}
|
||||
|
||||
type SelectedViewMapper = Record<IProject['id'], IProjectView['id']>
|
||||
|
||||
const selectedViews = ref<SelectedViewMapper>({})
|
||||
|
||||
watch(() => ([linkShares.value, availableViews.value]), ([newLinkShares, newProjectViews]) => {
|
||||
if (!newLinkShares?.length || !newProjectViews?.length) {
|
||||
selectedViews.value = {}
|
||||
return
|
||||
}
|
||||
|
||||
newLinkShares.forEach((linkShare) => {
|
||||
selectedViews.value[linkShare.id] = newProjectViews.length > 0 ? newProjectViews[0].id : null
|
||||
})
|
||||
}, {
|
||||
immediate:true,
|
||||
deep: true,
|
||||
})
|
||||
|
||||
|
||||
async function add(projectId: IProject['id']) {
|
||||
const newLinkShare = new LinkShareModel({
|
||||
right: selectedRight.value,
|
||||
@@ -310,9 +323,17 @@ async function remove(projectId: IProject['id']) {
|
||||
}
|
||||
}
|
||||
|
||||
function getShareLink(hash: string, viewId: IProjectView['id']) {
|
||||
return frontendUrl.value + 'share/' + hash + '/auth?view=' + viewId
|
||||
function getShareLink(hash: string, viewId: IProjectView['id']|null) {
|
||||
return frontendUrl.value + 'share/' + hash + '/auth' + (viewId ? '?view=' + viewId : '')
|
||||
}
|
||||
|
||||
const shareLinks = computed(() => {
|
||||
return linkShares.value.reduce((links, linkShare) => {
|
||||
links[linkShare.id] = getShareLink(linkShare.hash, selectedViews.value[linkShare.id] ?? null)
|
||||
return links
|
||||
}, {} as {[id: string]: string },
|
||||
)
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@@ -320,4 +341,4 @@ function getShareLink(hash: string, viewId: IProjectView['id']) {
|
||||
.sharables-project:not(.card-content) {
|
||||
overflow-y: auto
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
:class="{'textarea-empty': newTaskTitle === ''}"
|
||||
:placeholder="$t('project.list.addPlaceholder')"
|
||||
rows="1"
|
||||
@keyup="resetEmptyTitleError"
|
||||
@keydown="resetEmptyTitleError"
|
||||
@keydown.enter="handleEnter"
|
||||
/>
|
||||
<span class="icon is-small is-left">
|
||||
@@ -99,13 +99,10 @@ const taskAddHovered = useElementHover(taskAdd)
|
||||
|
||||
const errorMessage = ref('')
|
||||
|
||||
function resetEmptyTitleError(e: KeyboardEvent) {
|
||||
if (
|
||||
(e.which <= 90 && e.which >= 48 || e.which >= 96 && e.which <= 105)
|
||||
&& newTaskTitle.value !== ''
|
||||
) {
|
||||
errorMessage.value = ''
|
||||
}
|
||||
function resetEmptyTitleError() {
|
||||
if (!newTaskTitle.value) {
|
||||
errorMessage.value = ''
|
||||
}
|
||||
}
|
||||
|
||||
const loading = computed(() => taskStore.isLoading)
|
||||
@@ -135,7 +132,7 @@ async function addTask() {
|
||||
|
||||
const taskCollectionService = new TaskService()
|
||||
const projectIndices = new Map<number, number>()
|
||||
|
||||
|
||||
let currentProjectId = authStore.settings.defaultProjectId
|
||||
if (typeof router.currentRoute.value.params.projectId !== 'undefined') {
|
||||
currentProjectId = Number(router.currentRoute.value.params.projectId)
|
||||
@@ -143,22 +140,22 @@ async function addTask() {
|
||||
|
||||
// Create a map of project indices before creating tasks
|
||||
if (tasksToCreate.length > 1) {
|
||||
for (const {project} of tasksToCreate) {
|
||||
const projectId = project !== null
|
||||
? await taskStore.findProjectId({project, projectId: 0})
|
||||
: currentProjectId
|
||||
for (const {project} of tasksToCreate) {
|
||||
const projectId = project !== null
|
||||
? await taskStore.findProjectId({project, projectId: 0})
|
||||
: currentProjectId
|
||||
|
||||
if (!projectIndices.has(projectId)) {
|
||||
const newestTask = await taskCollectionService.getAll(new TaskModel({}), {
|
||||
sort_by: ['id'],
|
||||
order_by: ['desc'],
|
||||
per_page: 1,
|
||||
filter: `project_id = ${projectId}`,
|
||||
})
|
||||
projectIndices.set(projectId, newestTask[0]?.index || 0)
|
||||
if (!projectIndices.has(projectId)) {
|
||||
const newestTask = await taskCollectionService.getAll(new TaskModel({}), {
|
||||
sort_by: ['id'],
|
||||
order_by: ['desc'],
|
||||
per_page: 1,
|
||||
filter: `project_id = ${projectId}`,
|
||||
})
|
||||
projectIndices.set(projectId, newestTask[0]?.index || 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const newTasks = tasksToCreate.map(async ({title, project}, index) => {
|
||||
if (title === '') {
|
||||
@@ -169,7 +166,7 @@ async function addTask() {
|
||||
const projectId = project !== null
|
||||
? await taskStore.findProjectId({project, projectId: 0})
|
||||
: currentProjectId
|
||||
|
||||
|
||||
// Calculate new index for this task per project
|
||||
let taskIndex: number | undefined
|
||||
if (tasksToCreate.length > 1) {
|
||||
@@ -201,7 +198,6 @@ async function addTask() {
|
||||
|
||||
const isParent = allParentTasks.includes(t.title)
|
||||
if (t.parent === null && !isParent) {
|
||||
emit('taskAdded', createdTask)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -215,23 +211,37 @@ async function addTask() {
|
||||
otherTaskId: createdParentTask.id,
|
||||
relationKind: RELATION_KIND.PARENTTASK,
|
||||
}))
|
||||
|
||||
createdTask.relatedTasks[RELATION_KIND.PARENTTASK] = [{
|
||||
|
||||
if (typeof createdTask.relatedTasks === 'undefined') {
|
||||
createdTask.relatedTasks = {}
|
||||
}
|
||||
if (typeof createdTask.relatedTasks[RELATION_KIND.PARENTTASK] === 'undefined') {
|
||||
createdTask.relatedTasks[RELATION_KIND.PARENTTASK] = []
|
||||
}
|
||||
createdTask.relatedTasks[RELATION_KIND.PARENTTASK].push({
|
||||
...createdParentTask,
|
||||
relatedTasks: {}, // To avoid endless references
|
||||
}]
|
||||
// we're only emitting here so that the relation shows up in the project
|
||||
emit('taskAdded', createdTask)
|
||||
})
|
||||
|
||||
createdParentTask.relatedTasks[RELATION_KIND.SUBTASK] = [{
|
||||
if (typeof createdParentTask.relatedTasks === 'undefined') {
|
||||
createdParentTask.relatedTasks = {}
|
||||
}
|
||||
if (typeof createdParentTask.relatedTasks[RELATION_KIND.SUBTASK] === 'undefined') {
|
||||
createdParentTask.relatedTasks[RELATION_KIND.SUBTASK] = []
|
||||
}
|
||||
createdParentTask.relatedTasks[RELATION_KIND.SUBTASK].push({
|
||||
...createdTask,
|
||||
relatedTasks: {}, // To avoid endless references
|
||||
}]
|
||||
emit('taskAdded', createdParentTask)
|
||||
})
|
||||
|
||||
return rel
|
||||
})
|
||||
await Promise.all(relations)
|
||||
|
||||
// We're emitting all tasks at once at the end to avoid the same task showing up multiple times
|
||||
Object.values(createdTasks).forEach(task => {
|
||||
emit('taskAdded', task)
|
||||
})
|
||||
} catch (e) {
|
||||
newTaskTitle.value = taskTitleBackup
|
||||
if (e?.message === 'NO_PROJECT') {
|
||||
@@ -264,7 +274,7 @@ defineExpose({
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.task-add,
|
||||
// overwrite bulma styles
|
||||
// overwrite bulma styles
|
||||
.task-add .add-task__field {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ import {parseKebabDate} from '@/helpers/time/parseKebabDate'
|
||||
|
||||
import type {ITask, ITaskPartialWithId} from '@/modelTypes/ITask'
|
||||
import type {DateISO} from '@/types/DateISO'
|
||||
import type {GanttFilters} from '@/views/project/helpers/useGanttFilters'
|
||||
import type {GanttFilters} from '@/composables/useGanttFilters'
|
||||
|
||||
import {
|
||||
extendDayjs,
|
||||
|
||||
@@ -98,8 +98,14 @@ const props = withDefaults(defineProps<{
|
||||
showOverdue: false,
|
||||
})
|
||||
|
||||
const emit = defineEmits<{
|
||||
'tasksLoaded': true,
|
||||
}>()
|
||||
|
||||
const authStore = useAuthStore()
|
||||
const taskStore = useTaskStore()
|
||||
const projectStore = useProjectStore()
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const {t} = useI18n({useScope: 'global'})
|
||||
@@ -108,8 +114,6 @@ const tasks = ref<ITask[]>([])
|
||||
const showNothingToDo = ref<boolean>(false)
|
||||
const taskCollectionService = ref(new TaskCollectionService())
|
||||
|
||||
const projectStore = useProjectStore()
|
||||
|
||||
setTimeout(() => showNothingToDo.value = true, 100)
|
||||
|
||||
const showAll = computed(() => typeof props.dateFrom === 'undefined' || typeof props.dateTo === 'undefined')
|
||||
@@ -200,13 +204,14 @@ async function loadPendingTasks(from: Date|string, to: Date|string) {
|
||||
}
|
||||
}
|
||||
|
||||
let projectId = null
|
||||
const filterId = authStore.settings.frontendSettings.filterIdUsedOnOverview
|
||||
if (showAll.value && filterId && typeof projectStore.projects[filterId] !== 'undefined') {
|
||||
tasks.value = await taskCollectionService.value.getAll({projectId: filterId}, params)
|
||||
return
|
||||
projectId = filterId
|
||||
}
|
||||
|
||||
tasks.value = await taskStore.loadTasks(params)
|
||||
tasks.value = await taskStore.loadTasks(params, projectId)
|
||||
emit('tasksLoaded', true)
|
||||
}
|
||||
|
||||
// FIXME: this modification should happen in the store
|
||||
@@ -2,23 +2,23 @@
|
||||
import type {IUser} from '@/modelTypes/IUser'
|
||||
import BaseButton from '@/components/base/BaseButton.vue'
|
||||
import User from '@/components/misc/User.vue'
|
||||
import {computed} from 'vue'
|
||||
|
||||
const {
|
||||
assignees,
|
||||
remove,
|
||||
disabled,
|
||||
avatarSize = 30,
|
||||
inline = false,
|
||||
} = defineProps<{
|
||||
withDefaults(defineProps<{
|
||||
assignees: IUser[],
|
||||
remove?: (user: IUser) => void,
|
||||
disabled?: boolean,
|
||||
avatarSize?: number,
|
||||
inline?: boolean,
|
||||
}>()
|
||||
/** add this boolean prop to enable removal of assignees */
|
||||
canRemove?: boolean,
|
||||
}>(), {
|
||||
avatarSize: 30,
|
||||
inline: false,
|
||||
canRemove: false,
|
||||
})
|
||||
|
||||
const hasDelete = computed(() => typeof remove !== 'undefined' && !disabled)
|
||||
defineEmits<{
|
||||
remove: [user: IUser],
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -36,13 +36,13 @@ const hasDelete = computed(() => typeof remove !== 'undefined' && !disabled)
|
||||
:avatar-size="avatarSize"
|
||||
:show-username="false"
|
||||
:user="user"
|
||||
:class="{'m-2': hasDelete}"
|
||||
:class="{'m-2': canRemove && !disabled}"
|
||||
/>
|
||||
<BaseButton
|
||||
v-if="hasDelete"
|
||||
v-if="canRemove && !disabled"
|
||||
:key="'delete'+user.id"
|
||||
class="remove-assignee"
|
||||
@click="remove(user)"
|
||||
@click="$emit('remove', user)"
|
||||
>
|
||||
<Icon icon="times" />
|
||||
</BaseButton>
|
||||
|
||||
@@ -44,7 +44,7 @@ import flatPickr from 'vue-flatpickr-component'
|
||||
|
||||
import TaskService from '@/services/task'
|
||||
import type {ITask} from '@/modelTypes/ITask'
|
||||
import { getFlatpickrLanguage } from '@/helpers/flatpickrLanguage'
|
||||
import {useFlatpickrLanguage} from '@/helpers/useFlatpickrLanguage'
|
||||
|
||||
const props = defineProps<{
|
||||
modelValue: ITask,
|
||||
@@ -101,7 +101,7 @@ const flatPickerConfig = computed(() => ({
|
||||
enableTime: true,
|
||||
time_24hr: true,
|
||||
inline: true,
|
||||
locale: getFlatpickrLanguage(),
|
||||
locale: useFlatpickrLanguage().value,
|
||||
}))
|
||||
|
||||
function deferDays(days: number) {
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {ref, computed, watch, onBeforeUnmount} from 'vue'
|
||||
import {ref, computed, watchEffect, onBeforeUnmount} from 'vue'
|
||||
|
||||
import CustomTransition from '@/components/misc/CustomTransition.vue'
|
||||
import Editor from '@/components/input/AsyncEditor'
|
||||
@@ -46,21 +46,25 @@ import Editor from '@/components/input/AsyncEditor'
|
||||
import type {ITask} from '@/modelTypes/ITask'
|
||||
import {useTaskStore} from '@/stores/tasks'
|
||||
|
||||
type AttachmentUploadFunction = (file: File, onSuccess: (attachmentUrl: string) => void) => Promise<string>
|
||||
export type AttachmentUploadFunction = (file: File, onSuccess: (attachmentUrl: string) => void) => Promise<string>
|
||||
|
||||
const {
|
||||
modelValue,
|
||||
attachmentUpload,
|
||||
canWrite,
|
||||
} = defineProps<{
|
||||
const props = withDefaults(defineProps<{
|
||||
modelValue: ITask,
|
||||
attachmentUpload: AttachmentUploadFunction,
|
||||
canWrite: boolean,
|
||||
}>(), {
|
||||
canWrite: true,
|
||||
})
|
||||
|
||||
const emit = defineEmits<{
|
||||
'update:modelValue': [value: ITask]
|
||||
}>()
|
||||
|
||||
const emit = defineEmits(['update:modelValue'])
|
||||
|
||||
const description = ref<string>('')
|
||||
watchEffect(() => {
|
||||
description.value = props.modelValue.description
|
||||
})
|
||||
|
||||
const saved = ref(false)
|
||||
|
||||
// Since loading is global state, this variable ensures we're only showing the saving icon when saving the description.
|
||||
@@ -69,14 +73,6 @@ const saving = ref(false)
|
||||
const taskStore = useTaskStore()
|
||||
const loading = computed(() => taskStore.isLoading)
|
||||
|
||||
watch(
|
||||
() => modelValue.description,
|
||||
value => {
|
||||
description.value = value
|
||||
},
|
||||
{immediate: true},
|
||||
)
|
||||
|
||||
const changeTimeout = ref<ReturnType<typeof setTimeout> | null>(null)
|
||||
|
||||
async function saveWithDelay() {
|
||||
@@ -99,13 +95,12 @@ async function save() {
|
||||
if (changeTimeout.value !== null) {
|
||||
clearTimeout(changeTimeout.value)
|
||||
}
|
||||
|
||||
saved.value = false
|
||||
saving.value = true
|
||||
|
||||
try {
|
||||
// FIXME: don't update state from internal.
|
||||
const updated = await taskStore.update({
|
||||
...modelValue,
|
||||
...props.modelValue,
|
||||
description: description.value,
|
||||
})
|
||||
emit('update:modelValue', updated)
|
||||
@@ -119,13 +114,12 @@ async function save() {
|
||||
}
|
||||
}
|
||||
|
||||
async function uploadCallback(files: File[] | FileList): (Promise<string[]>) {
|
||||
|
||||
async function uploadCallback(files: File[] | FileList): Promise<string[]> {
|
||||
const uploadPromises: Promise<string>[] = []
|
||||
|
||||
files.forEach((file: File) => {
|
||||
const promise = new Promise<string>((resolve) => {
|
||||
attachmentUpload(file, (uploadedFileUrl: string) => resolve(uploadedFileUrl))
|
||||
props.attachmentUpload(file, (uploadedFileUrl: string) => resolve(uploadedFileUrl))
|
||||
})
|
||||
|
||||
uploadPromises.push(promise)
|
||||
|
||||
@@ -16,8 +16,9 @@
|
||||
<template #items="{items}">
|
||||
<AssigneeList
|
||||
:assignees="items"
|
||||
:remove="removeAssignee"
|
||||
:disabled="disabled"
|
||||
can-remove
|
||||
@remove="removeAssignee"
|
||||
/>
|
||||
</template>
|
||||
<template #searchResult="{option: user}">
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
<ul>
|
||||
<!-- Not localized because these only work in english -->
|
||||
<li>Today</li>
|
||||
<li>Tonight</li>
|
||||
<li>Tomorrow</li>
|
||||
<li>Next monday</li>
|
||||
<li>This weekend</li>
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
@update:modelValue="toggleTaskDone(task)"
|
||||
/>
|
||||
<RouterLink
|
||||
:to="{ name: route.name as string, params: { id: task.id } }"
|
||||
:to="{ name: route.name as string, params: { id: task.id }, state: { backdropView: route.fullPath } }"
|
||||
:class="{ 'is-strikethrough': task.done}"
|
||||
>
|
||||
<span
|
||||
@@ -183,7 +183,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {ref, reactive, shallowReactive, watch, computed, type PropType} from 'vue'
|
||||
import {ref, reactive, shallowReactive, watch, computed} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {useRoute} from 'vue-router'
|
||||
|
||||
@@ -206,27 +206,17 @@ import {useTaskStore} from '@/stores/tasks'
|
||||
import {useProjectStore} from '@/stores/projects'
|
||||
import {playPopSound} from '@/helpers/playPop'
|
||||
|
||||
const props = defineProps({
|
||||
taskId: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
initialRelatedTasks: {
|
||||
type: Object as PropType<ITask['relatedTasks']>,
|
||||
default: () => ({}),
|
||||
},
|
||||
showNoRelationsNotice: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
projectId: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
editEnabled: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
const props = withDefaults(defineProps<{
|
||||
taskId: number,
|
||||
initialRelatedTasks?: ITask['relatedTasks'],
|
||||
showNoRelationsNotice?: boolean,
|
||||
projectId: number,
|
||||
editEnabled: boolean,
|
||||
}>(), {
|
||||
initialRelatedTasks: () => ({}),
|
||||
showNoRelationsNotice: false,
|
||||
projectId: 0,
|
||||
editEnabled: true, // this seems like a mistake
|
||||
})
|
||||
|
||||
const taskStore = useTaskStore()
|
||||
|
||||
@@ -144,7 +144,7 @@ watch(
|
||||
if (newReminder) {
|
||||
reminder.value = newReminder
|
||||
|
||||
if (newReminder.relativeTo === null) {
|
||||
if (newReminder.relativeTo === null && newReminder.reminder !== null) {
|
||||
reminderDate.value = new Date(newReminder.reminder)
|
||||
}
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ function updateData() {
|
||||
})
|
||||
}
|
||||
|
||||
function addNewReminder(newReminder: ITaskReminder) {
|
||||
function addNewReminder(newReminder: ITaskReminder|null) {
|
||||
if (newReminder === null) {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<RouterLink
|
||||
v-if="showProject && typeof project !== 'undefined'"
|
||||
v-tooltip="$t('task.detail.belongsToProject', {project: project.title})"
|
||||
:to="{ name: 'project.index', params: { projectId: task.projectId } }"
|
||||
:to="{ name: 'project', params: { projectId: task.projectId } }"
|
||||
class="task-project mr-1"
|
||||
:class="{'mr-2': task.hexColor !== ''}"
|
||||
@click.stop
|
||||
@@ -139,7 +139,7 @@
|
||||
<RouterLink
|
||||
v-if="showProjectSeparately"
|
||||
v-tooltip="$t('task.detail.belongsToProject', {project: project.title})"
|
||||
:to="{ name: 'project.index', params: { projectId: task.projectId } }"
|
||||
:to="{ name: 'project', params: { projectId: task.projectId } }"
|
||||
class="task-project"
|
||||
@click.stop
|
||||
>
|
||||
|
||||
@@ -5,7 +5,7 @@ import {isoToKebabDate} from '@/helpers/time/isoToKebabDate'
|
||||
import {parseDateProp} from '@/helpers/time/parseDateProp'
|
||||
import {parseBooleanProp} from '@/helpers/time/parseBooleanProp'
|
||||
import {useRouteFilters} from '@/composables/useRouteFilters'
|
||||
import {useGanttTaskList} from './useGanttTaskList'
|
||||
import {useGanttTaskList} from '@/composables/useGanttTaskList'
|
||||
|
||||
import type {IProject} from '@/modelTypes/IProject'
|
||||
import type {TaskFilterParams} from '@/services/taskCollection'
|
||||
@@ -72,7 +72,7 @@ function ganttFiltersToRoute(filters: GanttFilters): RouteLocationRaw {
|
||||
}
|
||||
|
||||
return {
|
||||
name: 'project.view',
|
||||
name: 'project',
|
||||
params: {
|
||||
projectId: filters.projectId,
|
||||
viewId: filters.viewId,
|
||||
@@ -104,7 +104,7 @@ export function useGanttFilters(route: Ref<RouteLocationNormalized>, viewId: Ref
|
||||
ganttGetDefaultFilters,
|
||||
ganttRouteToFilters,
|
||||
ganttFiltersToRoute,
|
||||
['project.view'],
|
||||
['project'],
|
||||
)
|
||||
|
||||
const {
|
||||
@@ -72,7 +72,7 @@ export function useRouteWithModal() {
|
||||
}
|
||||
|
||||
const newRoute = {
|
||||
name: 'project.view',
|
||||
name: 'project',
|
||||
params: {
|
||||
projectId: baseStore.currentProject?.id,
|
||||
viewId,
|
||||
|
||||
@@ -2,7 +2,11 @@ import {ref, shallowReactive, watch, computed, type ComputedGetter} from 'vue'
|
||||
import {useRoute, useRouter} from 'vue-router'
|
||||
import {useRouteQuery} from '@vueuse/router'
|
||||
|
||||
import TaskCollectionService, {getDefaultTaskFilterParams, type TaskFilterParams} from '@/services/taskCollection'
|
||||
import TaskCollectionService, {
|
||||
type ExpandTaskFilterParam,
|
||||
getDefaultTaskFilterParams,
|
||||
type TaskFilterParams,
|
||||
} from '@/services/taskCollection'
|
||||
import type {ITask} from '@/modelTypes/ITask'
|
||||
import {error} from '@/message'
|
||||
import type {IProject} from '@/modelTypes/IProject'
|
||||
@@ -59,6 +63,7 @@ export function useTaskList(
|
||||
projectIdGetter: ComputedGetter<IProject['id']>,
|
||||
projectViewIdGetter: ComputedGetter<IProjectView['id']>,
|
||||
sortByDefault: SortBy = SORT_BY_DEFAULT,
|
||||
expandGetter: ComputedGetter<ExpandTaskFilterParam> = () => 'subtasks',
|
||||
) {
|
||||
|
||||
const projectId = computed(() => projectIdGetter())
|
||||
@@ -95,6 +100,7 @@ export function useTaskList(
|
||||
{
|
||||
...allParams.value,
|
||||
filter_timezone: authStore.settings.timezone,
|
||||
expand: expandGetter(),
|
||||
},
|
||||
page.value,
|
||||
]
|
||||
|
||||
@@ -51,10 +51,9 @@ export const checkAndSetApiUrl = (url: string | undefined | null): Promise<strin
|
||||
window.API_URL = urlToCheck.toString()
|
||||
|
||||
const configStore = useConfigStore()
|
||||
const updateConfig = () => configStore.update()
|
||||
|
||||
// Check if the api is reachable at the provided url
|
||||
return updateConfig()
|
||||
return configStore.update()
|
||||
.catch(e => {
|
||||
// Check if it is reachable at /api/v1 and http
|
||||
if (
|
||||
@@ -63,7 +62,7 @@ export const checkAndSetApiUrl = (url: string | undefined | null): Promise<strin
|
||||
) {
|
||||
urlToCheck.pathname = `${urlToCheck.pathname}api/v1`
|
||||
window.API_URL = urlToCheck.toString()
|
||||
return updateConfig()
|
||||
return configStore.update()
|
||||
}
|
||||
throw e
|
||||
})
|
||||
@@ -76,7 +75,7 @@ export const checkAndSetApiUrl = (url: string | undefined | null): Promise<strin
|
||||
) {
|
||||
urlToCheck.pathname = `${urlToCheck.pathname}api/v1`
|
||||
window.API_URL = urlToCheck.toString()
|
||||
return updateConfig()
|
||||
return configStore.update()
|
||||
}
|
||||
throw e
|
||||
})
|
||||
@@ -85,7 +84,7 @@ export const checkAndSetApiUrl = (url: string | undefined | null): Promise<strin
|
||||
if (urlToCheck.port !== API_DEFAULT_PORT) {
|
||||
urlToCheck.port = API_DEFAULT_PORT
|
||||
window.API_URL = urlToCheck.toString()
|
||||
return updateConfig()
|
||||
return configStore.update()
|
||||
}
|
||||
throw e
|
||||
})
|
||||
@@ -98,7 +97,7 @@ export const checkAndSetApiUrl = (url: string | undefined | null): Promise<strin
|
||||
) {
|
||||
urlToCheck.pathname = `${urlToCheck.pathname}api/v1`
|
||||
window.API_URL = urlToCheck.toString()
|
||||
return updateConfig()
|
||||
return configStore.update()
|
||||
}
|
||||
throw e
|
||||
})
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
import {useAuthStore} from '@/stores/auth'
|
||||
import FlatpickrLanguages from 'flatpickr/dist/l10n'
|
||||
import type { CustomLocale, key } from 'flatpickr/dist/types/locale'
|
||||
|
||||
export function getFlatpickrLanguage(): CustomLocale {
|
||||
const authStore = useAuthStore()
|
||||
const lang = authStore.settings.language
|
||||
const langPair = lang.split('-')
|
||||
let language = FlatpickrLanguages[lang === 'vi-vn' ? 'vn' : 'en']
|
||||
if (langPair.length > 0 && FlatpickrLanguages[langPair[0] as key] !== undefined) {
|
||||
language = FlatpickrLanguages[langPair[0] as key]
|
||||
}
|
||||
language.firstDayOfWeek = authStore.settings.weekStart ?? language.firstDayOfWeek
|
||||
return language
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
import wunderlistIcon from './icons/wunderlist.jpg'
|
||||
import todoistIcon from './icons/todoist.svg?url'
|
||||
import trelloIcon from './icons/trello.svg?url'
|
||||
import microsoftTodoIcon from './icons/microsoft-todo.svg?url'
|
||||
import vikunjaFileIcon from './icons/vikunja-file.png?url'
|
||||
import tickTickIcon from './icons/ticktick.svg?url'
|
||||
import wunderlistIcon from '@/assets/migrators/wunderlist.jpg'
|
||||
import todoistIcon from '@/assets/migrators/todoist.svg?url'
|
||||
import trelloIcon from '@/assets/migrators/trello.svg?url'
|
||||
import microsoftTodoIcon from '@/assets/migrators/microsoft-todo.svg?url'
|
||||
import vikunjaFileIcon from '@/assets/migrators/vikunja-file.png?url'
|
||||
import tickTickIcon from '@/assets/migrators/ticktick.svg?url'
|
||||
|
||||
export interface Migrator {
|
||||
id: string
|
||||
@@ -22,6 +22,11 @@ export const parseDate = (text: string, now: Date = new Date()): dateParseResult
|
||||
if (matchesDateExpr(text, 'today')) {
|
||||
return addTimeToDate(text, getDateFromInterval(calculateDayInterval('today')), 'today')
|
||||
}
|
||||
if (matchesDateExpr(text, 'tonight')) {
|
||||
const taskDate = getDateFromInterval(calculateDayInterval('today'))
|
||||
taskDate.setHours(21)
|
||||
return addTimeToDate(text, taskDate, 'tonight')
|
||||
}
|
||||
if (matchesDateExpr(text, 'tomorrow')) {
|
||||
return addTimeToDate(text, getDateFromInterval(calculateDayInterval('tomorrow')), 'tomorrow')
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
import {useAuthStore} from '@/stores/auth'
|
||||
// TODO: only import needed languages
|
||||
import FlatpickrLanguages from 'flatpickr/dist/l10n'
|
||||
import type { key } from 'flatpickr/dist/types/locale'
|
||||
import { computed } from 'vue'
|
||||
|
||||
export function useFlatpickrLanguage() {
|
||||
const authStore = useAuthStore()
|
||||
|
||||
return computed(() => {
|
||||
const userLanguage = authStore.settings.language
|
||||
if (!userLanguage) {
|
||||
return FlatpickrLanguages.en
|
||||
}
|
||||
|
||||
const langPair = userLanguage.split('-')
|
||||
const code = userLanguage === 'vi-VN' ? 'vn' : 'en'
|
||||
const language = FlatpickrLanguages?.[langPair?.[0] as key] || FlatpickrLanguages[code]
|
||||
language.firstDayOfWeek = authStore.settings.weekStart ?? language.firstDayOfWeek
|
||||
return language
|
||||
})
|
||||
}
|
||||
@@ -27,6 +27,7 @@ export const SUPPORTED_LOCALES = {
|
||||
'uk-UA': 'Українська',
|
||||
'lt-LT': 'Lietuvių Kalba',
|
||||
'bg-BG': 'Български',
|
||||
'ko-KR': '한국어',
|
||||
// IMPORTANT: Also add new languages to useDayjsLanguageSync
|
||||
} as const
|
||||
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "تم حذف الحافظة بنجاح.",
|
||||
"bucketTitleSavedSuccess": "تم حفظ عنوان الحافظة بنجاح.",
|
||||
"bucketLimitSavedSuccess": "تم حفظ الحد الأقصى للحافظة بنجاح.",
|
||||
"collapse": "طي هذه الحافظة"
|
||||
"collapse": "طي هذه الحافظة",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "نوع الاشتراك غير صالح.",
|
||||
"12002": "أنت مشترك بالفعل في العنصر نفسه أو في العنصر الرئيس.",
|
||||
"13001": "رابط المشاركة هذا يتطلب كلمة مرور للتوثيق، ولكن لم يتم توفير أي منها.",
|
||||
"13002": "كلمة مرور رابط المشاركة غير صالحة."
|
||||
"13002": "كلمة مرور رابط المشاركة غير صالحة.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "عن البرنامج",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "سنة|سنوات"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "Колоната беше успешно изтрита.",
|
||||
"bucketTitleSavedSuccess": "Заглавието на колоната беше успешно запазено.",
|
||||
"bucketLimitSavedSuccess": "Лимитът на колоната беше успешно запазен.",
|
||||
"collapse": "Свий тази колона"
|
||||
"collapse": "Свий тази колона",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "Типът на абонамента е невалиден.",
|
||||
"12002": "Вече сте абонирани за самия обект или за родителски обект.",
|
||||
"13001": "Тази споделена връзка изисква парола за удостоверяване, но такава не е предоставена.",
|
||||
"13002": "Предоставената парола за споделената връзка е невалидна."
|
||||
"13002": "Предоставената парола за споделената връзка е невалидна.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "За приложението",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "година|години"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
"12002": "You are already subscribed to the entity itself or a parent entity.",
|
||||
"13001": "This link share requires a password for authentication, but none was provided.",
|
||||
"13002": "The provided link share password was invalid."
|
||||
"13002": "The provided link share password was invalid.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "About",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "year|years"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "Sloupec byl úspěšně smazán.",
|
||||
"bucketTitleSavedSuccess": "Název sloupce byl úspěšně uložen.",
|
||||
"bucketLimitSavedSuccess": "Limit sloupce byl úspěšně uložen.",
|
||||
"collapse": "Sbalit tento sloupec"
|
||||
"collapse": "Sbalit tento sloupec",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "Typ předplatného je neplatný.",
|
||||
"12002": "Již jste přihlášeni k odběru samotného subjektu nebo nadřazeného subjektu.",
|
||||
"13001": "Tento sdílený odkaz vyžaduje heslo k ověření, ale žádné nebylo poskytnuto.",
|
||||
"13002": "Zadané heslo pro sdílený odkaz bylo neplatné."
|
||||
"13002": "Zadané heslo pro sdílený odkaz bylo neplatné.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "O aplikaci",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "rok|roky"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "Enhedstypen for abonnementet er ugyldigt.",
|
||||
"12002": "Du er allerede abonneret på selve enheden eller en overordnet enhed.",
|
||||
"13001": "Dette delingslink kræver en adgangskode til godkendelse, men ingen blev angivet.",
|
||||
"13002": "Adgangskoden til delingslinket er ugyldig."
|
||||
"13002": "Adgangskoden til delingslinket er ugyldig.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "Om",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "year|years"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -324,7 +324,7 @@
|
||||
"title": "Liste",
|
||||
"add": "Hinzufügen",
|
||||
"addPlaceholder": "Aufgabe hinzufügen…",
|
||||
"empty": "Dieses Project ist derzeit leer.",
|
||||
"empty": "Dieses Projekt ist derzeit leer.",
|
||||
"newTaskCta": "Aufgabe erstellen.",
|
||||
"editTask": "Aufgabe bearbeiten"
|
||||
},
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "Die Spalte wurde erfolgreich gelöscht.",
|
||||
"bucketTitleSavedSuccess": "Der Spaltenname wurde erfolgreich gespeichert.",
|
||||
"bucketLimitSavedSuccess": "Das Spaltenlimit wurde erfolgreich gespeichert.",
|
||||
"collapse": "Spalte einklappen"
|
||||
"collapse": "Spalte einklappen",
|
||||
"bucketLimitReached": "Du hast das Limit dieses Buckets erreicht. Entferne Aufgaben oder erhöhe das Limit, um neue Aufgaben hinzuzufügen."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "Der Abonnement-Typ ist ungültig.",
|
||||
"12002": "Du bist bereits zu dieser oder einer übergeordneten Entität abonniert.",
|
||||
"13001": "Das Passwort für diese Linkfreigabe wurde nicht angegeben.",
|
||||
"13002": "Das Passwort für diese Linkfreigabe war ungültig."
|
||||
"13002": "Das Passwort für diese Linkfreigabe war ungültig.",
|
||||
"14001": "Die angegebene Datei ist keine gültige ZIP-Datei."
|
||||
},
|
||||
"about": {
|
||||
"title": "Über",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "Jahr|Jahre"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -324,7 +324,7 @@
|
||||
"title": "Liste",
|
||||
"add": "Hinzufügen",
|
||||
"addPlaceholder": "Aufgabe hinzufügen…",
|
||||
"empty": "Dieses Project ist derzeit leer.",
|
||||
"empty": "Dieses Projekt ist derzeit leer.",
|
||||
"newTaskCta": "Aufgabe erstellen.",
|
||||
"editTask": "Aufgabe bearbeiten"
|
||||
},
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "Die Spalte wurde erfolgreich gelöscht.",
|
||||
"bucketTitleSavedSuccess": "Der Spaltenname wurde erfolgreich gespeichert.",
|
||||
"bucketLimitSavedSuccess": "Das Spaltenlimit wurde erfolgreich gespeichert.",
|
||||
"collapse": "Spalte einklappen"
|
||||
"collapse": "Spalte einklappen",
|
||||
"bucketLimitReached": "Du hast das Limit dieses Buckets erreicht. Entferne Aufgaben oder erhöhe das Limit, um neue Aufgaben hinzuzufügen."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "De Abonnement Entitätstyp isch ungültig.",
|
||||
"12002": "Du bisch scho zu dere oder ere übergordnete Entität abonniert.",
|
||||
"13001": "De teilti Link bruucht es Passwort, aber du hesch keis aahgeh.",
|
||||
"13002": "Das Passwort wo du geh hesch isch ungültig."
|
||||
"13002": "Das Passwort wo du geh hesch isch ungültig.",
|
||||
"14001": "Die angegebene Datei ist keine gültige ZIP-Datei."
|
||||
},
|
||||
"about": {
|
||||
"title": "Über",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "Jahr|Jahre"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
"12002": "You are already subscribed to the entity itself or a parent entity.",
|
||||
"13001": "This link share requires a password for authentication, but none was provided.",
|
||||
"13002": "The provided link share password was invalid."
|
||||
"13002": "The provided link share password was invalid.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "About",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "year|years"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
"12002": "You are already subscribed to the entity itself or a parent entity.",
|
||||
"13001": "This link share requires a password for authentication, but none was provided.",
|
||||
"13002": "The provided link share password was invalid."
|
||||
"13002": "The provided link share password was invalid.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "About",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "year|years"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "El contenedor se ha eliminado con éxito.",
|
||||
"bucketTitleSavedSuccess": "El título del contenedor se ha guardado con éxito.",
|
||||
"bucketLimitSavedSuccess": "El límite del contenedor se ha guardado con éxito.",
|
||||
"collapse": "Contraer este contenedor"
|
||||
"collapse": "Contraer este contenedor",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "El tipo de entidad de suscripción es inválido.",
|
||||
"12002": "Ya está suscrito a la entidad en sí misma o a una entidad padre.",
|
||||
"13001": "Este enlace compartido requiere una contraseña para la autenticación, pero no se ha proporcionado ninguna.",
|
||||
"13002": "La contraseña proporcionada del enlace compartido no es válida."
|
||||
"13002": "La contraseña proporcionada del enlace compartido no es válida.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "Acerca de",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "año|años"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "La colonne a bien été supprimée.",
|
||||
"bucketTitleSavedSuccess": "Le titre de la colonne a bien été enregistré.",
|
||||
"bucketLimitSavedSuccess": "La limite de la colonne a bien été enregistrée.",
|
||||
"collapse": "Réduire cette colonne"
|
||||
"collapse": "Réduire cette colonne",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "Le type d’entité d’abonnement est invalide.",
|
||||
"12002": "Vous êtes déjà abonné·e à l’entité elle-même ou à une entité parente.",
|
||||
"13001": "Le mot de passe requis n’a pas été fourni pour ce partage de lien.",
|
||||
"13002": "Mot de passe de partage de lien invalide."
|
||||
"13002": "Mot de passe de partage de lien invalide.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "À propos",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "année|années"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
"12002": "You are already subscribed to the entity itself or a parent entity.",
|
||||
"13001": "This link share requires a password for authentication, but none was provided.",
|
||||
"13002": "The provided link share password was invalid."
|
||||
"13002": "The provided link share password was invalid.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "About",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "year|years"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "A vödör sikeresen törölve.",
|
||||
"bucketTitleSavedSuccess": "A vödör címe sikeresen elmentve.",
|
||||
"bucketLimitSavedSuccess": "A vödör limit sikeresen elmentve.",
|
||||
"collapse": "Zárd össze ezt a vödröt"
|
||||
"collapse": "Zárd össze ezt a vödröt",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "A feliratkozás típusa érvénytelen.",
|
||||
"12002": "Ön már feliratkozott magára az entitásra, vagy egy szülő entitásra.",
|
||||
"13001": "A linkmegosztáshoz jelszó szükséges a hitelesítéshez, de nem adták meg.",
|
||||
"13002": "A megadott linkmegosztási jelszó érvénytelen."
|
||||
"13002": "A megadott linkmegosztási jelszó érvénytelen.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "Névjegy",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "év|évek"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "バケットは正常に削除されました。",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
"12002": "You are already subscribed to the entity itself or a parent entity.",
|
||||
"13001": "This link share requires a password for authentication, but none was provided.",
|
||||
"13002": "The provided link share password was invalid."
|
||||
"13002": "The provided link share password was invalid.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "Vikunjaについて",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "年"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,85 +4,85 @@
|
||||
"welcomeMorning": "Labas rytas {username}!",
|
||||
"welcomeDay": "Labas {username}!",
|
||||
"welcomeEvening": "Labas vakaras {username}!",
|
||||
"lastViewed": "Last viewed",
|
||||
"addToHomeScreen": "Add this app to your home screen for faster access and improved experience.",
|
||||
"goToOverview": "Go to overview",
|
||||
"lastViewed": "Paskutinį kartą žiūrėta",
|
||||
"addToHomeScreen": "Pridėkite aplikaciją į darbalaukį, lengvesniam pasiekiamumui ir geresnei patirčiai.",
|
||||
"goToOverview": "Eiti į apžvalgą",
|
||||
"project": {
|
||||
"importText": "Import your projects and tasks from other services into Vikunja:",
|
||||
"import": "Import your data into Vikunja"
|
||||
"importText": "Importuokite savo projektus ir užduotis iš kitų tiekėjų į Vikunja:",
|
||||
"import": "Importuoti duomenis į Vikunja"
|
||||
}
|
||||
},
|
||||
"demo": {
|
||||
"title": "This instance is in demo mode. Do not use this for real data!",
|
||||
"everythingWillBeDeleted": "Everything will be deleted in regular intervals!",
|
||||
"accountWillBeDeleted": "Your account will be deleted, including all projects, tasks and attachments you might create."
|
||||
"title": "Ši aplinka yra demontracinės būsenos. Nenaudokite realių duomenų!",
|
||||
"everythingWillBeDeleted": "Viskas bus ištrinta numatomais intervalais!",
|
||||
"accountWillBeDeleted": "Tavo paskyra bus ištrinta, įskaitant visus projektus, užduotis ir prisegtukus su tuo susijusius."
|
||||
},
|
||||
"404": {
|
||||
"title": "Not found",
|
||||
"text": "The page you requested does not exist."
|
||||
"title": "Nerasta",
|
||||
"text": "Norimas puslapis nerastas."
|
||||
},
|
||||
"ready": {
|
||||
"loading": "Vikunja is loading…",
|
||||
"errorOccured": "An error occurred:",
|
||||
"checkApiUrl": "Please check if the api url is correct.",
|
||||
"noApiUrlConfigured": "No API url was configured. Please set one below:"
|
||||
"loading": "Vikunja kraunasi…",
|
||||
"errorOccured": "Įvyko klaida:",
|
||||
"checkApiUrl": "Prašau patikrinti ar Api nuoroda yra teisinga.",
|
||||
"noApiUrlConfigured": "Jokia Api nuoroda nebuvo sukonfiguruota. Prašau, tai padaryti žemiau:"
|
||||
},
|
||||
"offline": {
|
||||
"title": "You are offline.",
|
||||
"text": "Please check your network connection and try again."
|
||||
"title": "Esi atsijungęs(-usi).",
|
||||
"text": "Prašau patikrinti interneto ryšį ir bandyti dar kartą."
|
||||
},
|
||||
"user": {
|
||||
"auth": {
|
||||
"username": "Vartotojo vardas",
|
||||
"usernameEmail": "Vartotojo vardas arba el. pašto adresas",
|
||||
"usernamePlaceholder": "pvz.: frederick",
|
||||
"email": "Email address",
|
||||
"emailPlaceholder": "e.g. frederic{'@'}vikunja.io",
|
||||
"password": "Password",
|
||||
"passwordPlaceholder": "e.g. •••••••••••",
|
||||
"forgotPassword": "Forgot your password?",
|
||||
"resetPassword": "Reset your password",
|
||||
"resetPasswordAction": "Send me a password reset link",
|
||||
"resetPasswordSuccess": "Check your inbox! You should have an email with instructions on how to reset your password.",
|
||||
"passwordsDontMatch": "Passwords don't match",
|
||||
"confirmEmailSuccess": "You successfully confirmed your email! You can log in now.",
|
||||
"totpTitle": "Two Factor Authentication Code",
|
||||
"totpPlaceholder": "e.g. 123456",
|
||||
"login": "Login",
|
||||
"createAccount": "Create account",
|
||||
"loginWith": "Log in with {provider}",
|
||||
"authenticating": "Authenticating…",
|
||||
"openIdStateError": "State does not match, refusing to continue!",
|
||||
"openIdGeneralError": "An error occurred while authenticating against the third party.",
|
||||
"logout": "Logout",
|
||||
"emailInvalid": "Please enter a valid email address.",
|
||||
"email": "El. pašto adresas",
|
||||
"emailPlaceholder": "pvz.: frederic{'@'}vikunja.io",
|
||||
"password": "Slaptažodis",
|
||||
"passwordPlaceholder": "pvz.: •••••••••••",
|
||||
"forgotPassword": "Pamiršote slaptažodį?",
|
||||
"resetPassword": "Pakeisti slaptažodį",
|
||||
"resetPasswordAction": "Atsiųskite man slaptažodžio atnaujinimo nuorodą",
|
||||
"resetPasswordSuccess": "Patikrink savo pašto dėžutę! Turėjai gauti laišką, kaip atnaujinti slaptažodį.",
|
||||
"passwordsDontMatch": "Slaptažodžiai nesutampa",
|
||||
"confirmEmailSuccess": "Sėkmingai patvirtinai savo el. paštą. Dabar gali prisijungti.",
|
||||
"totpTitle": "Dviejų faktorių identifikavimo kodas",
|
||||
"totpPlaceholder": "pvz.: 123456",
|
||||
"login": "Prisijungti",
|
||||
"createAccount": "Sukurti paskyrą",
|
||||
"loginWith": "Prisijungti su {provider}",
|
||||
"authenticating": "Identifikuojama…",
|
||||
"openIdStateError": "Būsena neatitinka, atsisakome toliau tęsti!",
|
||||
"openIdGeneralError": "Įvyko klaida bandant identifikuoti su trečiąja šalimi.",
|
||||
"logout": "Atsijungti",
|
||||
"emailInvalid": "Prašome įvesti galiojantį el. pašto adresą.",
|
||||
"usernameRequired": "Prašau nurodyti vartotojo vardą.",
|
||||
"usernameMustNotContainSpace": "Vartotojo vardas negali turėti tarpų.",
|
||||
"usernameMustNotLookLikeUrl": "Vartotojo vardas negali atrodyti kaip nuoroda.",
|
||||
"passwordRequired": "Please provide a password.",
|
||||
"passwordNotMin": "Password must have at least 8 characters.",
|
||||
"passwordRequired": "Prašome pateikti savo slaptažodį.",
|
||||
"passwordNotMin": "Slaptažodis turi būti bent 8 simbolių.",
|
||||
"passwordNotMax": "Slaptažodis gali būti daugiausiai 72 simbolių.",
|
||||
"showPassword": "Show the password",
|
||||
"hidePassword": "Hide the password",
|
||||
"noAccountYet": "Don't have an account yet?",
|
||||
"alreadyHaveAnAccount": "Already have an account?",
|
||||
"remember": "Stay logged in",
|
||||
"registrationDisabled": "Registration is disabled."
|
||||
"showPassword": "Rodyti slaptažodį",
|
||||
"hidePassword": "Paslėpti slaptažodį",
|
||||
"noAccountYet": "Dar neturi paskyros?",
|
||||
"alreadyHaveAnAccount": "Jau turi paskyrą?",
|
||||
"remember": "Likti prisijungus",
|
||||
"registrationDisabled": "Registracija yra išjungta."
|
||||
},
|
||||
"settings": {
|
||||
"title": "Settings",
|
||||
"newPasswordTitle": "Update Your Password",
|
||||
"newPassword": "New password",
|
||||
"newPasswordConfirm": "New password confirmation",
|
||||
"currentPassword": "Current password",
|
||||
"currentPasswordPlaceholder": "Your current password",
|
||||
"passwordsDontMatch": "The new password and its confirmation don't match.",
|
||||
"passwordUpdateSuccess": "The password was successfully updated.",
|
||||
"updateEmailTitle": "Update Your Email Address",
|
||||
"updateEmailNew": "New email address",
|
||||
"updateEmailSuccess": "Your email address was successfully updated. We've sent you a link to confirm it.",
|
||||
"title": "Nustatymai",
|
||||
"newPasswordTitle": "Atnaujinti savo slaptažodį",
|
||||
"newPassword": "Naujas slaptažodis",
|
||||
"newPasswordConfirm": "Naujo slaptažodžio patvirtinimas",
|
||||
"currentPassword": "Dabartinis slaptažodis",
|
||||
"currentPasswordPlaceholder": "Tavo dabartinis slaptažodis",
|
||||
"passwordsDontMatch": "Naujo slaptažodis ir patvirtinimas nesutampa.",
|
||||
"passwordUpdateSuccess": "Slaptažodis buvo sėkmingai atnaujintas.",
|
||||
"updateEmailTitle": "Atnaujink savo el. paštą",
|
||||
"updateEmailNew": "Naujas el. pašto adresas",
|
||||
"updateEmailSuccess": "El. paštas buvo sėkmingai atnaujintas. Nusiuntėme nuorodą patvirtinimui.",
|
||||
"general": {
|
||||
"title": "General Settings",
|
||||
"title": "Bendriniai nustatymai",
|
||||
"name": "Mano vardas",
|
||||
"newName": "Naujas vardas",
|
||||
"savedSuccess": "The settings were successfully updated.",
|
||||
@@ -185,15 +185,15 @@
|
||||
"title": "Delete your Vikunja Account",
|
||||
"text1": "Profilio ištrynimas yra neatšaukiamas. Visi projektai, užduotys ir kita susijusi informacijas bus pašalinta.",
|
||||
"text2": "Norėdama -s tęsti, įvesk savo slaptažodį. Gausi email'ą su tolimesnėmis instrukcijomis.",
|
||||
"text3": "To proceed, please press the button below. You will receive an email with further instructions.",
|
||||
"text3": "Norėdami tęsti, spauskite mygtuką žemiau. Gausite el. laišką su tolimesnėmis instrukcijomis.",
|
||||
"confirm": "Delete my account",
|
||||
"requestSuccess": "Tavo užklausa sėkminga. Gausi email'ą su tolimesnėmis instrukcijomis.",
|
||||
"passwordRequired": "Prašome įvesti savo slaptažodį.",
|
||||
"confirmSuccess": "You've successfully confirmed the deletion of your account. We will delete your account in three days.",
|
||||
"scheduled": "We will delete your Vikunja account at {date} ({dateSince}).",
|
||||
"confirmSuccess": "Sėkmingai patvirtinai paskyros ištrynimą. Ištrinsime tavo paskyrą per tris dienas.",
|
||||
"scheduled": "Ištrinsime tavo Vikunja paskyrą {date} ({dateSince}).",
|
||||
"scheduledCancel": "Norėdama -s nutraukti paskyros ištrynimą, spausk čia.",
|
||||
"scheduledCancelText": "Norėdama -s nutraukti paskyros ištrynimą, įveskite slaptažodį žemiau:",
|
||||
"scheduledCancelButton": "To cancel the deletion of your account, please press the button below:",
|
||||
"scheduledCancelButton": "Norint atšaukti paskyros ištynimą, prašome spausti mygtuką žemiau:",
|
||||
"scheduledCancelConfirm": "Atšaukti mano paskyros ištrynimą",
|
||||
"scheduledCancelSuccess": "We will not delete your account."
|
||||
},
|
||||
@@ -264,7 +264,7 @@
|
||||
"header": "Edit This Project",
|
||||
"title": "Edit \"{project}\"",
|
||||
"titlePlaceholder": "The project title goes here…",
|
||||
"identifierTooltip": "The project identifier can be used to uniquely identify a task across projects. You can set it to empty to disable it.",
|
||||
"identifierTooltip": "Projekto Id gali būti naudojamas unikaliai identifikuoti užduotį tarp projektų. Galima palikti tuščia, norint funkciją deaktyvuoti.",
|
||||
"identifier": "Projekto identifikatorius",
|
||||
"identifierPlaceholder": "Projekto identifikatorius bus čia…",
|
||||
"description": "Aprašymas",
|
||||
@@ -290,7 +290,7 @@
|
||||
"remove": "Pašalinti pasidalinimo nuorodą",
|
||||
"removeText": "Are you sure you want to remove this link share? It will no longer be possible to access this project with this link share. This cannot be undone!",
|
||||
"createSuccess": "Pasidalinimo nuoroda buvo sėkmingai sukurta.",
|
||||
"deleteSuccess": "The link share was successfully deleted",
|
||||
"deleteSuccess": "Nuorodos dalinimas buvo sėkmingai ištrintas",
|
||||
"view": "Peržiūra",
|
||||
"sharedBy": "Pasidalino {0}"
|
||||
},
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "Pasiekėte buketo limitą. Ištrinkite užduotis arba padidinkite limitą norėdami pridėti naujas užduotis."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -410,7 +411,7 @@
|
||||
"title": "Filtrai",
|
||||
"clear": "Anuliuoti filtrus",
|
||||
"showResults": "Rodyti rezultatus",
|
||||
"fromView": "The current view has a filter set as well:",
|
||||
"fromView": "Dabartinis vaizdas turi nustatytą filtrą taip pat:",
|
||||
"fromViewBoth": "It will be used in combination with what you enter here.",
|
||||
"attributes": {
|
||||
"title": "Pavadinimas",
|
||||
@@ -462,11 +463,11 @@
|
||||
"labels": "Etiketės sietinos su užduotimi",
|
||||
"project": "The project the task belongs to (only available for saved filters, not on a project level)",
|
||||
"reminders": "The reminders of the task as a date field, will return all tasks with at least one reminder matching the query",
|
||||
"created": "The time and date when the task was created",
|
||||
"updated": "The time and date when the task was last changed"
|
||||
"created": "Laikas ir data, kai užduotis buvo sukurta",
|
||||
"updated": "Data ir laikas, kada užduotis buvo pakeista"
|
||||
},
|
||||
"operators": {
|
||||
"intro": "The available operators for filtering include:",
|
||||
"intro": "Filtravimo operandai:",
|
||||
"notEqual": "Ne lygu",
|
||||
"equal": "Lygu",
|
||||
"greaterThan": "Daugiau už",
|
||||
@@ -479,14 +480,14 @@
|
||||
},
|
||||
"logicalOperators": {
|
||||
"intro": "To combine multiple conditions, you can use the following logical operators:",
|
||||
"and": "AND operator, matches if all conditions are true",
|
||||
"or": "OR operator, matches if any of the conditions are true",
|
||||
"and": "IR operatorius, sutampa jei visos sąlygos yra tiesa",
|
||||
"or": "ARBA operatorius, sutampa jei bet kuri sąlyga yra tiesa",
|
||||
"parentheses": "Skliausteliai sąlygų grupavimui"
|
||||
},
|
||||
"examples": {
|
||||
"intro": "Čia pateikiami keli filtravimo užklausos pavyzdžiai:",
|
||||
"priorityEqual": "Atitinka užduotis su 4 lygio prioritetu",
|
||||
"dueDatePast": "Matches tasks with a due date in the past",
|
||||
"dueDatePast": "Sutampa su užduotimis su praeities data",
|
||||
"undoneHighPriority": "Matches undone tasks with priority level 3 or higher",
|
||||
"assigneesIn": "Matches tasks assigned to either \"user1\" or \"user2\"",
|
||||
"priorityOneOrTwoPastDue": "Matches tasks with priority level 1 or 2 and a due date in the past"
|
||||
@@ -505,10 +506,10 @@
|
||||
"inProgress": "Importavimas progrese…",
|
||||
"alreadyMigrated1": "Atrodo, kad jau importavai savo info is {name} {date}.",
|
||||
"alreadyMigrated2": "Importing again is possible, but might create duplicates. Are you sure?",
|
||||
"confirm": "I am sure, please start migrating now!",
|
||||
"confirm": "Aš įsitikinęs, prašau pradėti migraciją dabar!",
|
||||
"importUpload": "Importuoti duomenis iš {name} į Vikunja, spausk mygtuką žemiau, norėdamas pasirinkti failą.",
|
||||
"upload": "Įkelti failą",
|
||||
"migrationStartedWillReciveEmail": "Vikunja will now import your lists/projects, tasks, notes, reminders and files from {service}. As this will take a while, we will send you an email once done. You can close this window now.",
|
||||
"migrationStartedWillReciveEmail": "Vikunja dabar importuos tavo sąrašus/projektus, užduotis, užrašus, priminimus ir dokumentus iš {service}. Kadangi tai užtruks, atsiųsime el. laišką, kai bus baigta. Gali uždaryti šį langą.",
|
||||
"migrationInProgress": "A migration is currently in progress. Please wait until it is done."
|
||||
},
|
||||
"label": {
|
||||
@@ -538,7 +539,7 @@
|
||||
}
|
||||
},
|
||||
"sharing": {
|
||||
"authenticating": "Authenticating…",
|
||||
"authenticating": "Identifikuojama…",
|
||||
"passwordRequired": "Šis pasidalintas projektas reikalauja slaptažodžio. Įveskite jį žemiau:",
|
||||
"error": "Įvyko klaida.",
|
||||
"invalidPassword": "Slaptažodis neteisingas."
|
||||
@@ -548,7 +549,7 @@
|
||||
"upcoming": "Būsimos",
|
||||
"settings": "Nustatymai",
|
||||
"imprint": "Įspaudas",
|
||||
"privacy": "Privacy Policy"
|
||||
"privacy": "Privatumo politika"
|
||||
},
|
||||
"misc": {
|
||||
"loading": "Kraunama…",
|
||||
@@ -559,18 +560,18 @@
|
||||
"refresh": "Atnaujinti",
|
||||
"disable": "Išjungti",
|
||||
"copy": "Kopijuoti į iškarpinę",
|
||||
"copyError": "Copy to clipboard failed",
|
||||
"copyError": "Kopijavimas į iškarpinę nepavyko",
|
||||
"search": "Paieška",
|
||||
"searchPlaceholder": "Rašykite čia norėdami ieškoti…",
|
||||
"previous": "Ankstesnis",
|
||||
"next": "Toliau",
|
||||
"poweredBy": "Sukurta Vikunja",
|
||||
"info": "Info",
|
||||
"info": "Informacija",
|
||||
"create": "Sukurti",
|
||||
"doit": "Atlikt!",
|
||||
"saving": "Išsaugoma…",
|
||||
"saved": "Išsaugota!",
|
||||
"default": "Default",
|
||||
"default": "Numatytasis",
|
||||
"close": "Uždaryti",
|
||||
"download": "Atsisiųsti",
|
||||
"showMenu": "Rodyti meniu",
|
||||
@@ -593,10 +594,10 @@
|
||||
"thisWeekend": "Šį savaitgalį",
|
||||
"laterThisWeek": "Vėliau šią savaitę",
|
||||
"nextWeek": "Kitą savaitę",
|
||||
"chooseDate": "Choose a date"
|
||||
"chooseDate": "Pasirinkite datą"
|
||||
},
|
||||
"editor": {
|
||||
"edit": "Edit",
|
||||
"edit": "Keisti",
|
||||
"done": "Atlikta",
|
||||
"heading1": "Heading 1",
|
||||
"heading1Tooltip": "Big section heading.",
|
||||
@@ -605,13 +606,13 @@
|
||||
"heading3": "Heading 3",
|
||||
"heading3Tooltip": "Smaller section header.",
|
||||
"headingSmaller": "Heading Smaller",
|
||||
"headingBigger": "Heading Bigger",
|
||||
"bold": "Bold",
|
||||
"italic": "Italic",
|
||||
"strikethrough": "Strikethrough",
|
||||
"headingBigger": "Antraštė Didesnė",
|
||||
"bold": "Paryškintas",
|
||||
"italic": "Pasviręs",
|
||||
"strikethrough": "Perbrauktas",
|
||||
"underline": "Underline",
|
||||
"code": "Code",
|
||||
"codeTooltip": "Capture a code snippet.",
|
||||
"codeTooltip": "Atvaizduoti kodo ištrauką.",
|
||||
"quote": "Quote",
|
||||
"quoteTooltip": "Capture a quote.",
|
||||
"bulletList": "Bullet list",
|
||||
@@ -667,7 +668,7 @@
|
||||
"thisWeek": "Šią savaitę",
|
||||
"restOfThisWeek": "The Rest of This Week",
|
||||
"nextWeek": "Kitą savaitę",
|
||||
"next7Days": "Next 7 Days",
|
||||
"next7Days": "Artimiausios 7 dienos",
|
||||
"lastWeek": "Praeitą savaitę",
|
||||
"thisMonth": "Šį mėnesį",
|
||||
"restOfThisMonth": "Šį mėnesį",
|
||||
@@ -682,35 +683,35 @@
|
||||
"startOfToday": "Pradedant šiandien",
|
||||
"endOfToday": "Iki dienos pabaigos",
|
||||
"beginningOflastWeek": "Praeitos savaitės pradžios",
|
||||
"endOfLastWeek": "End of last week",
|
||||
"beginningOfThisWeek": "Beginning of this week",
|
||||
"endOfThisWeek": "End of this week",
|
||||
"startOfNextWeek": "Start of next week",
|
||||
"endOfLastWeek": "Praeitos savaitės pabaiga",
|
||||
"beginningOfThisWeek": "Šios savaitės pradžia",
|
||||
"endOfThisWeek": "Šios savaaitės pabaaiga",
|
||||
"startOfNextWeek": "Kitos savaitės pradžia",
|
||||
"endOfNextWeek": "Iki kitos savaitės pabaigos",
|
||||
"in7Days": "Už 7 dienų",
|
||||
"beginningOfLastMonth": "Beginning of last month",
|
||||
"beginningOfLastMonth": "Praeito mėnesio pradžia",
|
||||
"endOfLastMonth": "Kito mėnesio pabaaigos",
|
||||
"startOfThisMonth": "Start of this month",
|
||||
"startOfThisMonth": "Šio mėnesio pradžia",
|
||||
"endOfThisMonth": "End of this month",
|
||||
"startOfNextMonth": "Start of next month",
|
||||
"startOfNextMonth": "Kito mėnesio pradžia",
|
||||
"endOfNextMonth": "Kito mėnesio pabaiga",
|
||||
"in30Days": "In 30 days",
|
||||
"startOfThisYear": "Beginning of this year",
|
||||
"endOfThisYear": "End of this year"
|
||||
"startOfThisYear": "Šių metų pradžia",
|
||||
"endOfThisYear": "Šių metų pabaiga"
|
||||
}
|
||||
},
|
||||
"datemathHelp": {
|
||||
"canuse": "You can use date math to filter for relative dates.",
|
||||
"learnhow": "Check out how it works",
|
||||
"title": "Date Math",
|
||||
"intro": "Specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
|
||||
"canuse": "Galite naudoti datų matematiką norint filtruoti aktualias datas.",
|
||||
"learnhow": "Peržiūrėkite, kaip tai veikia",
|
||||
"title": "Datų matematika",
|
||||
"intro": "Nurodyti reliatyvias datas, kurios yra išpręstos eigoje Vikunjos kai pritaikomas filtras.",
|
||||
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
|
||||
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
|
||||
"add1Day": "Pridėti vieną dieną",
|
||||
"minus1Day": "Subtract one day",
|
||||
"roundDay": "Round down to the nearest day",
|
||||
"supportedUnits": "Supported time units",
|
||||
"someExamples": "Examples of time expressions",
|
||||
"minus1Day": "Atimti vieną dieną",
|
||||
"roundDay": "Suapvalinti iki artimiausios dienos",
|
||||
"supportedUnits": "Palaikomi laiko formatai",
|
||||
"someExamples": "Laiko išraiškų pavyzdžiai",
|
||||
"units": {
|
||||
"seconds": "Seconds",
|
||||
"minutes": "Minutes",
|
||||
@@ -724,25 +725,25 @@
|
||||
"now": "Dabar",
|
||||
"in24h": "24-ių valandų bėgyje",
|
||||
"today": "Šiandien 00:00",
|
||||
"beginningOfThisWeek": "The beginning of this week at 00:00",
|
||||
"endOfThisWeek": "The end of this week",
|
||||
"beginningOfThisWeek": "Šios savaitės pradžia 00:00 val.",
|
||||
"endOfThisWeek": "Šios savaitės pabaiga",
|
||||
"in30Days": "Už 30 dienų",
|
||||
"datePlusMonth": "{0} plus one month at 00:00 of that day"
|
||||
"datePlusMonth": "{0} plius veianas mėnuo nuo 00:00 tos dienos"
|
||||
}
|
||||
}
|
||||
},
|
||||
"task": {
|
||||
"task": "Task",
|
||||
"new": "Create a task",
|
||||
"delete": "Delete this task",
|
||||
"createSuccess": "The task was successfully created.",
|
||||
"addReminder": "Add a reminder…",
|
||||
"doneSuccess": "The task was successfully marked as done.",
|
||||
"undoneSuccess": "The task was successfully un-marked as done.",
|
||||
"revertSuccess": "The task change was successfully undone.",
|
||||
"undo": "Undo",
|
||||
"openDetail": "Open task detail view",
|
||||
"checklistTotal": "{checked} of {total} tasks",
|
||||
"task": "Užduotis",
|
||||
"new": "Sukurti užduotį",
|
||||
"delete": "Ištrinti šią užduotį",
|
||||
"createSuccess": "Užduotis buvo sėkmingai sukurta.",
|
||||
"addReminder": "Pridėti priminimą…",
|
||||
"doneSuccess": "Užduotis buvo sėkmingai pažymėta kaip baigta.",
|
||||
"undoneSuccess": "Užduotis buvo sėkmingai atžymėta kaip atlikta.",
|
||||
"revertSuccess": "Užduoties pakeitimai buvo sėkmingai pakeisti.",
|
||||
"undo": "Anuliuoti",
|
||||
"openDetail": "Atidaryti užduoties duomenų vaizdą",
|
||||
"checklistTotal": "{checked} iš {total} užduočių",
|
||||
"checklistAllDone": "{total} užduotys",
|
||||
"show": {
|
||||
"titleCurrent": "Dabartinės Užduotys",
|
||||
@@ -750,18 +751,18 @@
|
||||
"noDates": "Rodyti užduotis be datų",
|
||||
"overdue": "Rodyti neišpildytas užduotis",
|
||||
"fromuntil": "Užduotys nuo {from} iki {until}",
|
||||
"select": "Select a date range",
|
||||
"noTasks": "Nothing to do — Have a nice day!"
|
||||
"select": "Pasirinkti datos rėžį",
|
||||
"noTasks": "Nėra darbų - Gražios dienos!"
|
||||
},
|
||||
"detail": {
|
||||
"chooseDueDate": "Click here to set a due date",
|
||||
"chooseStartDate": "Click here to set a start date",
|
||||
"chooseEndDate": "Click here to set an end date",
|
||||
"move": "Move task to a different project",
|
||||
"done": "Mark task done!",
|
||||
"undone": "Mark as undone",
|
||||
"created": "Created {0} by {1}",
|
||||
"updated": "Updated {0}",
|
||||
"chooseDueDate": "Paspauskite čia norėdami pakeisti atlikimo datą",
|
||||
"chooseStartDate": "Paspauskite čia nustatyti pradžios datą",
|
||||
"chooseEndDate": "Spauskite čia norėdami nustatyti pabaigos datą",
|
||||
"move": "Perkelti užduotį į kitą projektą",
|
||||
"done": "Pažymėti užduotį kaip atliką!",
|
||||
"undone": "Pažymėti kaip neatliktą",
|
||||
"created": "Sukurta {0} {1}",
|
||||
"updated": "Atnaujinta {0}",
|
||||
"doneAt": "Done {0}",
|
||||
"updateSuccess": "The task was saved successfully.",
|
||||
"deleteSuccess": "The task has been deleted successfully.",
|
||||
@@ -899,23 +900,23 @@
|
||||
"new": "New Task Relation",
|
||||
"searchPlaceholder": "Type search for a task to add as related…",
|
||||
"createPlaceholder": "Pridėti kaip susijusią užduotį",
|
||||
"differentProject": "This task belongs to a different project.",
|
||||
"differentProject": "Ši užduotis priklauso kitam projektui.",
|
||||
"noneYet": "Kol kas užduoties ryšio nėra.",
|
||||
"delete": "Delete Task Relation",
|
||||
"deleteText1": "Are you sure you want to delete this task relation?",
|
||||
"select": "Pasirinkite ryšio tipą",
|
||||
"taskRequired": "Please select a task or enter a new task title.",
|
||||
"taskRequired": "Prašome pasirinkti užduotį arba įvesti užduoties pavadinimą.",
|
||||
"kinds": {
|
||||
"subtask": "Sub užduotis | Sub užduotys",
|
||||
"parenttask": "Parent Task | Parent Tasks",
|
||||
"related": "Related Task | Related Tasks",
|
||||
"parenttask": "Tėvinė Užduotis | Tėvinė Užduotis",
|
||||
"related": "Susijusi Užduotis | Susijusi Užduotis",
|
||||
"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",
|
||||
"copiedfrom": "Nukopijuota iš | Nukopijuota iš",
|
||||
"copiedto": "Copied To | Copied To"
|
||||
}
|
||||
},
|
||||
@@ -950,13 +951,13 @@
|
||||
"hint": "Use magic prefixes to define due dates, assignees and other task properties.",
|
||||
"title": "Quick Add Magic",
|
||||
"intro": "When creating a task, you can use special keywords to directly add attributes to the newly created task. This allows to add commonly used attributes to tasks much faster.",
|
||||
"multiple": "You can use this multiple times.",
|
||||
"multiple": "Galima tai naudoti kelis kartus.",
|
||||
"label1": "Norėdama -s pridėti etiketę, paprasčiausiai naudoti etiketės prefikso pavadinimą su {prefix}.",
|
||||
"label2": "Vikunja pirmiausiai patikrins ar etiketė egzistuoja, ir sukurs, jei neegzistuoja.",
|
||||
"label3": "Norint naudoti tarpus, paprasčiausiai pridėkite \" ar ' prieš etiketės pavadinimą.",
|
||||
"label4": "Pavyzdžiui: {prefix} \"Etiketė su tarpais\".",
|
||||
"priority1": "To set a task's priority, add a number 1-5, prefixed with a {prefix}.",
|
||||
"priority2": "The higher the number, the higher the priority.",
|
||||
"priority2": "Kuo didesnis skaičius, tuo aukštesnis prioritetas.",
|
||||
"assignees": "Norint tiesiogiai priskirti užduotį vartotojui, pridėkite vartotojo vardą kaip prefiksą su {prefix} prie užduoties.",
|
||||
"project1": "Nustatyti užduoties projektą, įveskite prefiksą su {prefix}.",
|
||||
"project2": "This will return an error if the project does not exist.",
|
||||
@@ -986,7 +987,7 @@
|
||||
"addUser": "Add to team",
|
||||
"makeMember": "Make Member",
|
||||
"makeAdmin": "Make Admin",
|
||||
"success": "The team was successfully updated.",
|
||||
"success": "Komanda buvo sėkmingai atnaujinta.",
|
||||
"userAddedSuccess": "The team member was successfully added.",
|
||||
"madeMember": "The team member was successfully made member.",
|
||||
"madeAdmin": "The team member was successfully made admin.",
|
||||
@@ -1006,7 +1007,7 @@
|
||||
"leave": {
|
||||
"title": "Leave team",
|
||||
"text1": "Are you sure you want to leave this team?",
|
||||
"text2": "You will lose access to all projects this team has access to. If you change your mind you'll need a team admin to add you again.",
|
||||
"text2": "Prarasite visas teises, kurias turi ši komanda. Jei persigalvotum, reikės komandos administratoriaus pagalbos, kad pridėtų atgal.",
|
||||
"success": "Jūs sėkmingai palikote komandą."
|
||||
}
|
||||
},
|
||||
@@ -1026,10 +1027,10 @@
|
||||
"title": "Keyboard Shortcuts",
|
||||
"general": "General",
|
||||
"allPages": "These shortcuts work on all pages.",
|
||||
"currentPageOnly": "These shortcuts work only on the current page.",
|
||||
"somePagesOnly": "These shortcuts work only on some pages.",
|
||||
"currentPageOnly": "Esami trumpiniai veikia tik dabartiniame puslapyje.",
|
||||
"somePagesOnly": "Šie trumpiniai veikia tik kai kuriuose puslapiuose.",
|
||||
"toggleMenu": "Toggle The Menu",
|
||||
"quickSearch": "Open the search/quick action bar",
|
||||
"quickSearch": "Atidaryti paiešką/greitų veiksmų juostą",
|
||||
"then": "then",
|
||||
"task": {
|
||||
"title": "Task Page",
|
||||
@@ -1040,7 +1041,7 @@
|
||||
"attachment": "Add an attachment to this task",
|
||||
"related": "Modify related tasks of this task",
|
||||
"color": "Change the color of this task",
|
||||
"move": "Move this task to another project",
|
||||
"move": "Perkelti šią užduotį kitam projektui",
|
||||
"reminder": "Valdyti šios užduoties priminimus",
|
||||
"description": "Praskleisti redagavimą užduoties apraše",
|
||||
"delete": "Delete this task",
|
||||
@@ -1086,7 +1087,7 @@
|
||||
"url": "Vikunja URL",
|
||||
"urlPlaceholder": "eg. https://localhost:3456",
|
||||
"change": "change",
|
||||
"use": "Using Vikunja installation at {0}",
|
||||
"use": "Naudojama Vikunja instaliacija {0}",
|
||||
"error": "Could not find or use Vikunja installation at \"{domain}\". Please check if the url has the correct format and you can reach it when accessing it directly and try again.",
|
||||
"success": "Using Vikunja installation at \"{domain}\".",
|
||||
"urlRequired": "A url is required."
|
||||
@@ -1129,7 +1130,7 @@
|
||||
},
|
||||
"reaction": {
|
||||
"reactedWith": "{user} reacted with {value}",
|
||||
"reactedWithAnd": "{users} and {lastUser} reacted with {value}",
|
||||
"reactedWithAnd": "{users} ir {lastUser} sureagavo {value}",
|
||||
"reactedWithAndMany": "{users} and {num} more reacted reacted with {value}",
|
||||
"add": "Add your reaction"
|
||||
},
|
||||
@@ -1184,7 +1185,7 @@
|
||||
"6002": "The team does not exist.",
|
||||
"6004": "The team already has access to that project.",
|
||||
"6005": "The user is already a member of that team.",
|
||||
"6006": "Cannot delete the last team member.",
|
||||
"6006": "Negalime ištrinti paskutinio komandos nario.",
|
||||
"6007": "The team does not have access to the project to perform that action.",
|
||||
"7002": "Naudotojas jau turi prieigą prie šio projekto.",
|
||||
"7003": "You do not have access to that project.",
|
||||
@@ -1199,10 +1200,11 @@
|
||||
"10005": "There can be only one done bucket per project.",
|
||||
"11001": "Išsaugotas filtras neegzistuoja.",
|
||||
"11002": "Išsaugotu filtru negalima pasidalinti.",
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
"12002": "You are already subscribed to the entity itself or a parent entity.",
|
||||
"12001": "Prenumeratos objekto tipas yra nevalidus.",
|
||||
"12002": "Esi prisiregistravęs prie visko ar prie tėvinio subjekto.",
|
||||
"13001": "Šis dalinimasis nuoroda reikalauja slaptažodžio identifikavimuisi, bet jis nebuvo pateiktas.",
|
||||
"13002": "Pateikta slaptažodžio dalinimosi nuoroda negalioja."
|
||||
"13002": "Pateikta slaptažodžio dalinimosi nuoroda negalioja.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "Apie",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "metai|metai"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
"12002": "You are already subscribed to the entity itself or a parent entity.",
|
||||
"13001": "This link share requires a password for authentication, but none was provided.",
|
||||
"13002": "The provided link share password was invalid."
|
||||
"13002": "The provided link share password was invalid.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "Over",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "year|years"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "Kolumna została pomyślnie usunięta.",
|
||||
"bucketTitleSavedSuccess": "Tytuł kolumny został pomyślnie zapisany.",
|
||||
"bucketLimitSavedSuccess": "Limit kolumny został pomyślnie zapisany.",
|
||||
"collapse": "Zwiń tę kolumnę"
|
||||
"collapse": "Zwiń tę kolumnę",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "Typ subskrypcji jest nieprawidłowy.",
|
||||
"12002": "Subskrybujesz już tę jednostkę lub jej jednostkę nadrzędną.",
|
||||
"13001": "Ten udostępniony link wymaga hasła do uwierzytelnienia, ale nie został podany.",
|
||||
"13002": "Podane hasło udostępnionego linku było nieprawidłowe."
|
||||
"13002": "Podane hasło udostępnionego linku było nieprawidłowe.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "O aplikacji",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "rok|lat"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "O bucket foi excluído com sucesso.",
|
||||
"bucketTitleSavedSuccess": "O título do bucket foi salvo com sucesso.",
|
||||
"bucketLimitSavedSuccess": "O limite do bucket foi salvo com sucesso.",
|
||||
"collapse": "Recolher este bucket"
|
||||
"collapse": "Recolher este bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "A entidade de subscrição é inválida.",
|
||||
"12002": "Você já assinou a entidade em si ou uma entidade pai.",
|
||||
"13001": "Este link compartilhado requer uma senha para autenticação, mas nenhum foi fornecido.",
|
||||
"13002": "A senha de compartilhamento do link fornecido é inválida."
|
||||
"13002": "A senha de compartilhamento do link fornecido é inválida.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "Sobre",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "ano|anos"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "O conjunto foi eliminado com sucesso.",
|
||||
"bucketTitleSavedSuccess": "O título do conjunto foi salvo com sucesso.",
|
||||
"bucketLimitSavedSuccess": "O limite do conjunto foi salvo com sucesso.",
|
||||
"collapse": "Encolher este conjunto"
|
||||
"collapse": "Encolher este conjunto",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "O tipo de entidade da subscrição é inválido.",
|
||||
"12002": "Já estás subcrito na entidade ou numa entidade parente.",
|
||||
"13001": "Este link partilhado requer uma palavra-passe para autenticação, mas nenhuma foi fornecida.",
|
||||
"13002": "A palavra-passe fornecida para o link partilhado é inválida."
|
||||
"13002": "A palavra-passe fornecida para o link partilhado é inválida.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "Sobre",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "ano|anos"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
"12002": "You are already subscribed to the entity itself or a parent entity.",
|
||||
"13001": "This link share requires a password for authentication, but none was provided.",
|
||||
"13002": "The provided link share password was invalid."
|
||||
"13002": "The provided link share password was invalid.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "About",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "year|years"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "Колонка удалена.",
|
||||
"bucketTitleSavedSuccess": "Название колонки сохранено.",
|
||||
"bucketLimitSavedSuccess": "Лимит колонки сохранён.",
|
||||
"collapse": "Свернуть эту колонку"
|
||||
"collapse": "Свернуть эту колонку",
|
||||
"bucketLimitReached": "Вы достигли лимита колонки. Удалите какие-нибудь задачи или увеличьте лимит, чтобы добавить новые задачи."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "Некорректный тип подписки.",
|
||||
"12002": "Вы уже подписаны на сам объект или родительский объект.",
|
||||
"13001": "Эта ссылка требует пароля, но он не был предоставлен.",
|
||||
"13002": "Неверный пароль ссылки для обмена."
|
||||
"13002": "Неверный пароль ссылки для обмена.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "О Vikunja",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "год|года|лет"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
"12002": "You are already subscribed to the entity itself or a parent entity.",
|
||||
"13001": "This link share requires a password for authentication, but none was provided.",
|
||||
"13002": "The provided link share password was invalid."
|
||||
"13002": "The provided link share password was invalid.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "About",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "year|years"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "Vedro je bilo uspešno izbrisano.",
|
||||
"bucketTitleSavedSuccess": "Naslov vedra je bil uspešno shranjen.",
|
||||
"bucketLimitSavedSuccess": "Omejitev vedra je bila uspešno shranjena.",
|
||||
"collapse": "Zloži vedro"
|
||||
"collapse": "Zloži vedro",
|
||||
"bucketLimitReached": "Dosegli ste omejitev vedra. Odstranite opravila ali povečajte omejitev, da dodate nova opravila."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "Tipa entitete naročnine je neveljaven.",
|
||||
"12002": "Ste že naročeni na samo entiteto ali nadrejeno entiteto.",
|
||||
"13001": "Ta skupna raba povezave zahteva geslo za preverjanje pristnosti, vendar ni bil podan.",
|
||||
"13002": "Navedeno geslo za skupno rabo povezave je bilo neveljavno."
|
||||
"13002": "Navedeno geslo za skupno rabo povezave je bilo neveljavno.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "O programu",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "leto|let"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
"12002": "You are already subscribed to the entity itself or a parent entity.",
|
||||
"13001": "This link share requires a password for authentication, but none was provided.",
|
||||
"13002": "The provided link share password was invalid."
|
||||
"13002": "The provided link share password was invalid.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "About",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "year|years"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
"12002": "You are already subscribed to the entity itself or a parent entity.",
|
||||
"13001": "This link share requires a password for authentication, but none was provided.",
|
||||
"13002": "The provided link share password was invalid."
|
||||
"13002": "The provided link share password was invalid.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "Om",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "år|år"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
"12002": "You are already subscribed to the entity itself or a parent entity.",
|
||||
"13001": "This link share requires a password for authentication, but none was provided.",
|
||||
"13002": "The provided link share password was invalid."
|
||||
"13002": "The provided link share password was invalid.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "About",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "year|years"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "Стрічку вилучено.",
|
||||
"bucketTitleSavedSuccess": "Назву стрічки збережено.",
|
||||
"bucketLimitSavedSuccess": "Межу стрічки збережено.",
|
||||
"collapse": "Згорнути стрічку"
|
||||
"collapse": "Згорнути стрічку",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "The subscription entity type is invalid.",
|
||||
"12002": "Ви підписані на саму суть або головну частину.",
|
||||
"13001": "This link share requires a password for authentication, but none was provided.",
|
||||
"13002": "Хибний пароль для поширеного посилання."
|
||||
"13002": "Хибний пароль для поширеного посилання.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "Про",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "рік|роки|років"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,7 +365,8 @@
|
||||
"deleteBucketSuccess": "The bucket has been deleted successfully.",
|
||||
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.",
|
||||
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.",
|
||||
"collapse": "Collapse this bucket"
|
||||
"collapse": "Collapse this bucket",
|
||||
"bucketLimitReached": "You have reached the bucket limit. Remove tasks or increase the limit to add new tasks."
|
||||
},
|
||||
"pseudo": {
|
||||
"favorites": {
|
||||
@@ -1202,7 +1203,8 @@
|
||||
"12001": "Loại đăng ký không hợp lệ.",
|
||||
"12002": "Bạn đã đăng ký với tổ chức này hoặc tổ chức chính rồi.",
|
||||
"13001": "Chia sẻ liên kết này yêu cầu mật khẩu để xác thực, nhưng không có mật khẩu nào được cung cấp.",
|
||||
"13002": "Mật khẩu chia sẻ liên kết không hợp lệ."
|
||||
"13002": "Mật khẩu chia sẻ liên kết không hợp lệ.",
|
||||
"14001": "The provided file is not a valid zip file."
|
||||
},
|
||||
"about": {
|
||||
"title": "Về ứng dụng",
|
||||
@@ -1219,4 +1221,4 @@
|
||||
"years": "year|years"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||