Compare commits
1 Commits
v0.4.0
...
feat/invit
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e43ed96945 |
@@ -3,8 +3,6 @@
|
|||||||
# Required environment variables
|
# Required environment variables
|
||||||
NEXT_PUBLIC_BASE_URL= # e.g. https://kan.bn
|
NEXT_PUBLIC_BASE_URL= # e.g. https://kan.bn
|
||||||
BETTER_AUTH_SECRET= # Random 32+ char string (can gen with: openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 32)
|
BETTER_AUTH_SECRET= # Random 32+ char string (can gen with: openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 32)
|
||||||
|
|
||||||
# Fill if you want to use an external database
|
|
||||||
POSTGRES_URL= # e.g. postgresql://kan:your_password@your_host:5432/kan
|
POSTGRES_URL= # e.g. postgresql://kan:your_password@your_host:5432/kan
|
||||||
|
|
||||||
# Only required if deploying from compose
|
# Only required if deploying from compose
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -50,6 +50,3 @@ docker-compose.override.yml
|
|||||||
# runtime env
|
# runtime env
|
||||||
__ENV.js
|
__ENV.js
|
||||||
i18n.cache
|
i18n.cache
|
||||||
|
|
||||||
# pgdata
|
|
||||||
/apps/web/pgdata
|
|
||||||
|
|||||||
61
README.md
61
README.md
@@ -138,37 +138,36 @@ pnpm dev
|
|||||||
|
|
||||||
## Environment Variables 🔐
|
## Environment Variables 🔐
|
||||||
|
|
||||||
| Variable | Description | Required | Example |
|
| Variable | Description | Required | Example |
|
||||||
| ----------------------------------------- | -------------------------------------------------------- | ------------------------ | --------------------------------------------- |
|
| -------------------------------- | -------------------------------------------------------- | ------------------ | --------------------------------------------- |
|
||||||
| `POSTGRES_URL` | PostgreSQL connection URL | To use external database | `postgres://user:pass@localhost:5432/db` |
|
| `POSTGRES_URL` | PostgreSQL connection URL | Yes | `postgres://user:pass@localhost:5432/db` |
|
||||||
| `EMAIL_FROM` | Sender email address | For Email | `"Kan <hello@mail.kan.bn>"` |
|
| `EMAIL_FROM` | Sender email address | For Email | `"Kan <hello@mail.kan.bn>"` |
|
||||||
| `SMTP_HOST` | SMTP server hostname | For Email | `smtp.resend.com` |
|
| `SMTP_HOST` | SMTP server hostname | For Email | `smtp.resend.com` |
|
||||||
| `SMTP_PORT` | SMTP server port | For Email | `465` |
|
| `SMTP_PORT` | SMTP server port | For Email | `465` |
|
||||||
| `SMTP_USER` | SMTP username/email | No | `resend` |
|
| `SMTP_USER` | SMTP username/email | No | `resend` |
|
||||||
| `SMTP_PASSWORD` | SMTP password/token | No | `re_xxxx` |
|
| `SMTP_PASSWORD` | SMTP password/token | No | `re_xxxx` |
|
||||||
| `SMTP_SECURE` | Use secure SMTP connection (defaults to true if not set) | For Email | `true` |
|
| `SMTP_SECURE` | Use secure SMTP connection (defaults to true if not set) | For Email | `true` |
|
||||||
| `NEXT_PUBLIC_BASE_URL` | Base URL of your installation | Yes | `http://localhost:3000` |
|
| `NEXT_PUBLIC_BASE_URL` | Base URL of your installation | Yes | `http://localhost:3000` |
|
||||||
| `BETTER_AUTH_SECRET` | Auth encryption secret | Yes | Random 32+ char string |
|
| `BETTER_AUTH_SECRET` | Auth encryption secret | Yes | Random 32+ char string |
|
||||||
| `BETTER_AUTH_TRUSTED_ORIGINS` | Allowed callback origins | No | `http://localhost:3000,http://localhost:3001` |
|
| `BETTER_AUTH_TRUSTED_ORIGINS` | Allowed callback origins | No | `http://localhost:3000,http://localhost:3001` |
|
||||||
| `GOOGLE_CLIENT_ID` | Google OAuth client ID | For Google login | `xxx.apps.googleusercontent.com` |
|
| `GOOGLE_CLIENT_ID` | Google OAuth client ID | For Google login | `xxx.apps.googleusercontent.com` |
|
||||||
| `GOOGLE_CLIENT_SECRET` | Google OAuth client secret | For Google login | `xxx` |
|
| `GOOGLE_CLIENT_SECRET` | Google OAuth client secret | For Google login | `xxx` |
|
||||||
| `DISCORD_CLIENT_ID` | Discord OAuth client ID | For Discord login | `xxx` |
|
| `DISCORD_CLIENT_ID` | Discord OAuth client ID | For Discord login | `xxx` |
|
||||||
| `DISCORD_CLIENT_SECRET` | Discord OAuth client secret | For Discord login | `xxx` |
|
| `DISCORD_CLIENT_SECRET` | Discord OAuth client secret | For Discord login | `xxx` |
|
||||||
| `GITHUB_CLIENT_ID` | GitHub OAuth client ID | For GitHub login | `xxx` |
|
| `GITHUB_CLIENT_ID` | GitHub OAuth client ID | For GitHub login | `xxx` |
|
||||||
| `GITHUB_CLIENT_SECRET` | GitHub OAuth client secret | For GitHub login | `xxx` |
|
| `GITHUB_CLIENT_SECRET` | GitHub OAuth client secret | For GitHub login | `xxx` |
|
||||||
| `TRELLO_APP_API_KEY` | Trello app API key | For Trello import | `xxx` |
|
| `TRELLO_APP_API_KEY` | Trello app API key | For Trello import | `xxx` |
|
||||||
| `TRELLO_APP_API_SECRET` | Trello app API secret | For Trello import | `xxx` |
|
| `TRELLO_APP_API_SECRET` | Trello app API secret | For Trello import | `xxx` |
|
||||||
| `S3_REGION` | S3 storage region | For file uploads | `WEUR` |
|
| `S3_REGION` | S3 storage region | For file uploads | `WEUR` |
|
||||||
| `S3_ENDPOINT` | S3 endpoint URL | For file uploads | `https://xxx.r2.cloudflarestorage.com` |
|
| `S3_ENDPOINT` | S3 endpoint URL | For file uploads | `https://xxx.r2.cloudflarestorage.com` |
|
||||||
| `S3_ACCESS_KEY_ID` | S3 access key | For file uploads | `xxx` |
|
| `S3_ACCESS_KEY_ID` | S3 access key | For file uploads | `xxx` |
|
||||||
| `S3_SECRET_ACCESS_KEY` | S3 secret key | For file uploads | `xxx` |
|
| `S3_SECRET_ACCESS_KEY` | S3 secret key | For file uploads | `xxx` |
|
||||||
| `S3_FORCE_PATH_STYLE` | Use path-style URLs for S3 | For file uploads | `true` |
|
| `S3_FORCE_PATH_STYLE` | Use path-style URLs for S3 | For file uploads | `true` |
|
||||||
| `NEXT_PUBLIC_STORAGE_URL` | Storage service URL | For file uploads | `https://storage.kanbn.com` |
|
| `NEXT_PUBLIC_STORAGE_URL` | Storage service URL | For file uploads | `https://storage.kanbn.com` |
|
||||||
| `NEXT_PUBLIC_STORAGE_DOMAIN` | Storage domain name | For file uploads | `kanbn.com` |
|
| `NEXT_PUBLIC_STORAGE_DOMAIN` | Storage domain name | For file uploads | `kanbn.com` |
|
||||||
| `NEXT_PUBLIC_AVATAR_BUCKET_NAME` | S3 bucket name for avatars | For file uploads | `avatars` |
|
| `NEXT_PUBLIC_AVATAR_BUCKET_NAME` | S3 bucket name for avatars | For file uploads | `avatars` |
|
||||||
| `NEXT_PUBLIC_ALLOW_CREDENTIALS` | Allow email & password login | For authentication | `true` |
|
| `NEXT_PUBLIC_ALLOW_CREDENTIALS` | Allow email & password login | For authentication | `true` |
|
||||||
| `NEXT_PUBLIC_DISABLE_SIGN_UP` | Disable sign up | For authentication | `false` |
|
| `NEXT_PUBLIC_DISABLE_SIGN_UP` | Disable sign up | For authentication | `false` |
|
||||||
| `NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY` | Hide “Powered by kan.bn” on public boards (self-host) | For white labelling | `true` |
|
|
||||||
|
|
||||||
See `.env.example` for a complete list of supported environment variables.
|
See `.env.example` for a complete list of supported environment variables.
|
||||||
|
|
||||||
|
|||||||
@@ -81,4 +81,5 @@ ARG PORT=3000
|
|||||||
ENV PORT=${PORT}
|
ENV PORT=${PORT}
|
||||||
EXPOSE ${PORT}
|
EXPOSE ${PORT}
|
||||||
|
|
||||||
CMD ["sh", "-c", "if [ -n \"$POSTGRES_URL\" ]; then cd /app && pnpm db:migrate && cd /app/apps/web; fi && pnpm start"]
|
CMD ["sh", "-c", "cd /app && pnpm db:migrate && cd /app/apps/web && pnpm start"]
|
||||||
|
|
||||||
|
|||||||
@@ -13,19 +13,12 @@ checksums:
|
|||||||
Activity%20logs/singular: 8b1f0bb96a905646ecfad1cfdfa42168
|
Activity%20logs/singular: 8b1f0bb96a905646ecfad1cfdfa42168
|
||||||
Add%20a%20card/singular: 9d80becc4fe65a74e0004e4fd290735d
|
Add%20a%20card/singular: 9d80becc4fe65a74e0004e4fd290735d
|
||||||
Add%20a%20comment.../singular: c28cfccc0cc69a2a2487e37eb9988028
|
Add%20a%20comment.../singular: c28cfccc0cc69a2a2487e37eb9988028
|
||||||
Add%20an%20item.../singular: f8e7993980420698700b07f56b3a38af
|
Add%20description...%20(type%20'%2F'%20to%20open%20commands)/singular: df99ea599521682e9ad0a90716955dc6
|
||||||
Add%20checklist/singular: 05d73200b56cfea75fb3a0f94c9bfb74
|
|
||||||
Add%20description...%20(type%20'%2F'%20to%20open%20commands%20or%20'%40'%20to%20mention)/singular: c6eb35a796dd7ac0e3dbc66244b71248
|
|
||||||
Add%20details.../singular: 2f42547fd5d199f173aa7a88c8a9b19a
|
|
||||||
Add%20label/singular: 0be732d46df263265935fda342097a08
|
Add%20label/singular: 0be732d46df263265935fda342097a08
|
||||||
Add%20member/singular: 11979625770516ca287e929381778e02
|
Add%20member/singular: 11979625770516ca287e929381778e02
|
||||||
added%20a%20checklist/singular: 44304f4a5ef3a46378eea243b5d2df79
|
|
||||||
added%20a%20checklist%20item/singular: 20bc0330dba5a9ec978e04bec174365a
|
|
||||||
added%20a%20label%20to%20the%20card/singular: 04c5e4ee9b7b7e77ef089d2ac473d235
|
added%20a%20label%20to%20the%20card/singular: 04c5e4ee9b7b7e77ef089d2ac473d235
|
||||||
added%20a%20member%20to%20the%20card/singular: 95495e770062e2fd590333d56e6308d2
|
added%20a%20member%20to%20the%20card/singular: 95495e770062e2fd590333d56e6308d2
|
||||||
added%20checklist%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: fb6a852c50c1629f47c6f155fc93fdee
|
added%20label%20%3C0%3E%7Blabel%7D%3C%2F0%3E/singular: 1caba6b6bca4c6fa1ab173d241059dc2
|
||||||
added%20checklist%20item%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: bdd202da20b1fffbec21792c5453f90c
|
|
||||||
added%20label%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: b32be052b3d57de0c9120fa7f9fc86ee
|
|
||||||
Admin%20roles/singular: 32a5d78073b9bb9a246773afba8831df
|
Admin%20roles/singular: 32a5d78073b9bb9a246773afba8831df
|
||||||
All%20seats%20are%20free%20during%20the%20beta%20until%20Sept%201st!/singular: 015cec3899cf99e37c3cf231d432e31d
|
All%20seats%20are%20free%20during%20the%20beta%20until%20Sept%201st!/singular: 015cec3899cf99e37c3cf231d432e31d
|
||||||
All%20systems%20operational/singular: ee943a4046b09e6334cceeea9fda2bfc
|
All%20systems%20operational/singular: ee943a4046b09e6334cceeea9fda2bfc
|
||||||
@@ -38,11 +31,10 @@ checksums:
|
|||||||
Are%20you%20sure%20want%20to%20remove%20%7BentityLabel%7D%3F/singular: f9b67026c5ef86ac4d5944380d571961
|
Are%20you%20sure%20want%20to%20remove%20%7BentityLabel%7D%3F/singular: f9b67026c5ef86ac4d5944380d571961
|
||||||
Are%20you%20sure%20you%20want%20to%20delete%20the%20workspace%20%7B0%7D%3F/singular: 27ba2854202dd77c51e78c64e5c93946
|
Are%20you%20sure%20you%20want%20to%20delete%20the%20workspace%20%7B0%7D%3F/singular: 27ba2854202dd77c51e78c64e5c93946
|
||||||
Are%20you%20sure%20you%20want%20to%20delete%20this%20card%3F/singular: 131a5a7cccca7be8b32c987d9fa0b0c0
|
Are%20you%20sure%20you%20want%20to%20delete%20this%20card%3F/singular: 131a5a7cccca7be8b32c987d9fa0b0c0
|
||||||
Are%20you%20sure%20you%20want%20to%20delete%20this%20checklist%3F/singular: 7c0f540603474b1a30462dda087fd2f0
|
|
||||||
Are%20you%20sure%20you%20want%20to%20delete%20this%20comment%3F/singular: 55fe6f1b52b71b91b2a079cfda3cc7fe
|
Are%20you%20sure%20you%20want%20to%20delete%20this%20comment%3F/singular: 55fe6f1b52b71b91b2a079cfda3cc7fe
|
||||||
Are%20you%20sure%20you%20want%20to%20delete%20this%20label%3F/singular: 037fbaf1d04356937e6afb574714f51f
|
Are%20you%20sure%20you%20want%20to%20delete%20this%20label%3F/singular: 037fbaf1d04356937e6afb574714f51f
|
||||||
Are%20you%20sure%20you%20want%20to%20delete%20your%20account%3F/singular: 428b74d781063224c3e63980e1094ec3
|
Are%20you%20sure%20you%20want%20to%20delete%20your%20account%3F/singular: 428b74d781063224c3e63980e1094ec3
|
||||||
assigned%20%3C0%3E%7B0%7D%3C%2F0%3E%20to%20the%20card/singular: 9df6d89fa83706123dedd8cba2243d04
|
assigned%20%3C0%3E%7BmemberName%7D%3C%2F0%3E%20to%20the%20card/singular: 4fb1c419a78a0f010a3e5790801551fc
|
||||||
Awaiting%20Customer/singular: 122c108794f321c10e05a08f09b11457
|
Awaiting%20Customer/singular: 122c108794f321c10e05a08f09b11457
|
||||||
Backlog/singular: 35919fd5b10ad212839a75e72829fe4e
|
Backlog/singular: 35919fd5b10ad212839a75e72829fe4e
|
||||||
Basic%20Kanban/singular: e46ebc406749486f3907436970d4d6c7
|
Basic%20Kanban/singular: e46ebc406749486f3907436970d4d6c7
|
||||||
@@ -69,7 +61,6 @@ checksums:
|
|||||||
Card%20title/singular: 7c34f59f4005e6cb3a6ff546ea0b96e3
|
Card%20title/singular: 7c34f59f4005e6cb3a6ff546ea0b96e3
|
||||||
Change%20the%20language%20of%20the%20app./singular: fb20db145e28ed44aba89c146ded7bfc
|
Change%20the%20language%20of%20the%20app./singular: fb20db145e28ed44aba89c146ded7bfc
|
||||||
Check%20your%20inbox/singular: e9a430fcd298def74212238df0f680d6
|
Check%20your%20inbox/singular: e9a430fcd298def74212238df0f680d6
|
||||||
Checklist%20name/singular: 5eb5de823f7ca5a4d97bb41e6a3f675a
|
|
||||||
Clear%20filters/singular: 8f40ab5af527e4b190da94e7b6221379
|
Clear%20filters/singular: 8f40ab5af527e4b190da94e7b6221379
|
||||||
Click%20on%20the%20link%20we've%20sent%20to%20%7BmagicLinkRecipient%7D%20to%20sign%20in./singular: 210b6ff8727f976182ec3f29ea3c7667
|
Click%20on%20the%20link%20we've%20sent%20to%20%7BmagicLinkRecipient%7D%20to%20sign%20in./singular: 210b6ff8727f976182ec3f29ea3c7667
|
||||||
Code%20Review/singular: a2da6c2339301e7c3ddf068c4ff9f7e8
|
Code%20Review/singular: a2da6c2339301e7c3ddf068c4ff9f7e8
|
||||||
@@ -79,8 +70,6 @@ checksums:
|
|||||||
Company/singular: 9e36d11fa82d1bd4563eef2abc4fcfba
|
Company/singular: 9e36d11fa82d1bd4563eef2abc4fcfba
|
||||||
Complete/singular: d3e36d723de0cfdea51c5b4171d30b4d
|
Complete/singular: d3e36d723de0cfdea51c5b4171d30b4d
|
||||||
Complete%20control%20and%20ownership%3A/singular: 0d8b682ba873272217425ccfc96aa9cd
|
Complete%20control%20and%20ownership%3A/singular: 0d8b682ba873272217425ccfc96aa9cd
|
||||||
completed%20a%20checklist%20item/singular: 757b04c6c80cc927e1c597c0ad4fda33
|
|
||||||
completed%20checklist%20item%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: 71ec18acf051fc909a48a07ca3578673
|
|
||||||
Confirm%20URL%20change/singular: e14b4ce081d1ef6194b37e1814e97b39
|
Confirm%20URL%20change/singular: e14b4ce081d1ef6194b37e1814e97b39
|
||||||
Connect%20Trello/singular: 4440a0b9e387ef7136e3958e7a089213
|
Connect%20Trello/singular: 4440a0b9e387ef7136e3958e7a089213
|
||||||
Connect%20your%20favorite%20tools%20to%20streamline%20your%20workflow./singular: 033c5dcdb059ccb634aef7fe63f2f45d
|
Connect%20your%20favorite%20tools%20to%20streamline%20your%20workflow./singular: 033c5dcdb059ccb634aef7fe63f2f45d
|
||||||
@@ -94,7 +83,6 @@ checksums:
|
|||||||
Create%20another/singular: 2de8a82a416eb78c0462aa36278edc9a
|
Create%20another/singular: 2de8a82a416eb78c0462aa36278edc9a
|
||||||
Create%20board/singular: 155b62818bfab0e34f0089e1b34a32f3
|
Create%20board/singular: 155b62818bfab0e34f0089e1b34a32f3
|
||||||
Create%20card/singular: 32792935dd5837a9433909b04021c22b
|
Create%20card/singular: 32792935dd5837a9433909b04021c22b
|
||||||
Create%20checklist/singular: 5cbca15a7004558c4e6d381f83a34da2
|
|
||||||
Create%20label/singular: c64e8180fa956f005edc1fd9b8e65abb
|
Create%20label/singular: c64e8180fa956f005edc1fd9b8e65abb
|
||||||
Create%20list/singular: 858c3d514aa95765ec82114393199144
|
Create%20list/singular: 858c3d514aa95765ec82114393199144
|
||||||
Create%20new%20board/singular: cbb87b1f4cc46b336ad9510c9f19407c
|
Create%20new%20board/singular: cbb87b1f4cc46b336ad9510c9f19407c
|
||||||
@@ -115,10 +103,6 @@ checksums:
|
|||||||
Delete%20comment/singular: a3dae0c9ddbc73677aad9812e3dffd69
|
Delete%20comment/singular: a3dae0c9ddbc73677aad9812e3dffd69
|
||||||
Delete%20list/singular: b694f58e4c973d8797a78e746b550b1f
|
Delete%20list/singular: b694f58e4c973d8797a78e746b550b1f
|
||||||
Delete%20workspace/singular: 9017c821209528d9b20d40a488854cdf
|
Delete%20workspace/singular: 9017c821209528d9b20d40a488854cdf
|
||||||
deleted%20a%20checklist/singular: c54f922dc6c238c9141c700cb3180baf
|
|
||||||
deleted%20a%20checklist%20item/singular: 2b7a861600102ac5c271dd25c1df261a
|
|
||||||
deleted%20checklist%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: 60f9107197e756487d3f95a1083846b5
|
|
||||||
deleted%20checklist%20item%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: 8b7e270f612f9e91bda7f5cfb853d843
|
|
||||||
Design/singular: 991b75727b6784c1a063a7462b76186d
|
Design/singular: 991b75727b6784c1a063a7462b76186d
|
||||||
Disconnect%20Trello/singular: a2dd737d133887d34504728c7e7f05e3
|
Disconnect%20Trello/singular: a2dd737d133887d34504728c7e7f05e3
|
||||||
Discuss%20and%20collaborate%20on%20cards./singular: f2e87816709f602130831ead50bba457
|
Discuss%20and%20collaborate%20on%20cards./singular: f2e87816709f602130831ead50bba457
|
||||||
@@ -227,20 +211,17 @@ checksums:
|
|||||||
Long-term/singular: 51cb6f0b112250c5a091ca5f0866904b
|
Long-term/singular: 51cb6f0b112250c5a091ca5f0866904b
|
||||||
Low%20Priority/singular: 509b5cb7c1e8a185e0aa6d38c64c90e8
|
Low%20Priority/singular: 509b5cb7c1e8a185e0aa6d38c64c90e8
|
||||||
magic%20link/singular: db9d17a5bd98bba8aa0d8068c68579f3
|
magic%20link/singular: db9d17a5bd98bba8aa0d8068c68579f3
|
||||||
marked%20a%20checklist%20item%20as%20incomplete/singular: 35d0822f65971b97774b962561b02649
|
|
||||||
marked%20checklist%20item%20%3C0%3E%7B0%7D%3C%2F0%3E%20as%20incomplete/singular: 4c38799ff25321ea25017bf4cd8e2e4f
|
|
||||||
Medium%20Priority/singular: 1f527cd6d1ed602930bcaa303f503b51
|
Medium%20Priority/singular: 1f527cd6d1ed602930bcaa303f503b51
|
||||||
Members/singular: 0932e80cba1e3e0a7f52bb67ff31da32
|
Members/singular: 0932e80cba1e3e0a7f52bb67ff31da32
|
||||||
Members%20%7C%20%7B0%7D/singular: a29e3e9f1076acd178c417d047584e88
|
Members%20%7C%20%7B0%7D/singular: a29e3e9f1076acd178c417d047584e88
|
||||||
Monthly/singular: 818f1192e32bb855597f930d3e78806e
|
Monthly/singular: 818f1192e32bb855597f930d3e78806e
|
||||||
moved%20the%20card%20from%20%3C0%3E%7B0%7D%3C%2F0%3E%20to%3C1%3E%7B1%7D%3C%2F1%3E/singular: 11edf0427766c26db541d46379dc3c16
|
moved%20the%20card%20from%20%3C0%3E%7BfromList%7D%3C%2F0%3E%20to%3C1%3E%7BtoList%7D%3C%2F1%3E/singular: c2d0d72ad97510344b51154ef15060e0
|
||||||
moved%20the%20card%20to%20another%20list/singular: 2e8c41bfafb42fa299ce56e4300205ff
|
moved%20the%20card%20to%20another%20list/singular: 2e8c41bfafb42fa299ce56e4300205ff
|
||||||
Name/singular: 9368b5a047572b6051f334af5aa76819
|
Name/singular: 9368b5a047572b6051f334af5aa76819
|
||||||
Need%20help%3F/singular: 04e7322f2d3ffb2d73ff2f64b71637c8
|
Need%20help%3F/singular: 04e7322f2d3ffb2d73ff2f64b71637c8
|
||||||
New/singular: 126d036fae5fb6b629728ecb97e6195b
|
New/singular: 126d036fae5fb6b629728ecb97e6195b
|
||||||
New%20board/singular: 63f4e979e29a7fc2f5c09ff91fa75966
|
New%20board/singular: 63f4e979e29a7fc2f5c09ff91fa75966
|
||||||
New%20card/singular: a33f6219a756127f91c2523cfe845a19
|
New%20card/singular: a33f6219a756127f91c2523cfe845a19
|
||||||
New%20checklist/singular: 58252b71e9693ae0f4d2d0b72108a569
|
|
||||||
New%20import/singular: e8fddfe15dd170277df919e5d37efd47
|
New%20import/singular: e8fddfe15dd170277df919e5d37efd47
|
||||||
New%20label/singular: 890040da52a88c16c249a4ac78980f81
|
New%20label/singular: 890040da52a88c16c249a4ac78980f81
|
||||||
New%20list/singular: 146c2e642b11056a0b07ed65733e4178
|
New%20list/singular: 146c2e642b11056a0b07ed65733e4178
|
||||||
@@ -287,10 +268,7 @@ checksums:
|
|||||||
Remove%20member/singular: 1d77c2ca3768e486fd1fb5df30cb60d9
|
Remove%20member/singular: 1d77c2ca3768e486fd1fb5df30cb60d9
|
||||||
removed%20a%20label%20from%20the%20card/singular: f83ec18850a2a8a3f8242a740a04df06
|
removed%20a%20label%20from%20the%20card/singular: f83ec18850a2a8a3f8242a740a04df06
|
||||||
removed%20a%20member%20from%20the%20card/singular: 0bd7561bb79358fde3d595c3e60a315a
|
removed%20a%20member%20from%20the%20card/singular: 0bd7561bb79358fde3d595c3e60a315a
|
||||||
removed%20label%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: 7e0936b15831e65754588b8512f62fcb
|
removed%20label%20%3C0%3E%7Blabel%7D%3C%2F0%3E/singular: 1e7ebc1866136352bdc3cd90afc083f0
|
||||||
renamed%20a%20checklist/singular: 4d208de1857740e63469007c5b8b491a
|
|
||||||
renamed%20checklist%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: e95d119ef65b0af6c0a96bef182be671
|
|
||||||
renamed%20checklist%20item%20to%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: 50f55f71f9245890afee434d7adc2140
|
|
||||||
Research/singular: 3368e9638d1619babd6df9fad592274f
|
Research/singular: 3368e9638d1619babd6df9fad592274f
|
||||||
Resolution/singular: 6d8bd9e1bd7dae5ae38c93061d32990e
|
Resolution/singular: 6d8bd9e1bd7dae5ae38c93061d32990e
|
||||||
Resources/singular: ec7fb05ed963bb6781a35782b3475502
|
Resources/singular: ec7fb05ed963bb6781a35782b3475502
|
||||||
@@ -346,28 +324,22 @@ checksums:
|
|||||||
Trello%20disconnected/singular: 54b24a3e6c9a7eedd8c8d1060ab1175d
|
Trello%20disconnected/singular: 54b24a3e6c9a7eedd8c8d1060ab1175d
|
||||||
Trello%20imports/singular: 6827eca403faa8f89891d17827e72af9
|
Trello%20imports/singular: 6827eca403faa8f89891d17827e72af9
|
||||||
Triaging/singular: 1d40799fcae53a8a27688fdae2a48dee
|
Triaging/singular: 1d40799fcae53a8a27688fdae2a48dee
|
||||||
Unable%20to%20add%20checklist%20item/singular: 4c4c3eaaf10b348b39ae97eb5dc455df
|
|
||||||
Unable%20to%20add%20comment/singular: 49bb435880817434698f31a6069564d6
|
Unable%20to%20add%20comment/singular: 49bb435880817434698f31a6069564d6
|
||||||
Unable%20to%20create%20card/singular: 90112ea12ec6fa42097a6e022ae048a4
|
Unable%20to%20create%20card/singular: 90112ea12ec6fa42097a6e022ae048a4
|
||||||
Unable%20to%20create%20checklist/singular: 94eed122e42e0951cd08b9ec62f5eeb6
|
|
||||||
Unable%20to%20create%20list/singular: 7fbbf8314f8d08a4123c7daef09fed05
|
Unable%20to%20create%20list/singular: 7fbbf8314f8d08a4123c7daef09fed05
|
||||||
Unable%20to%20create%20workspace/singular: c1c949477e121d73ed6683eddf9cd874
|
Unable%20to%20create%20workspace/singular: c1c949477e121d73ed6683eddf9cd874
|
||||||
Unable%20to%20delete%20card/singular: 50ff06aa1265fe464f776aba33f1bef9
|
Unable%20to%20delete%20card/singular: 50ff06aa1265fe464f776aba33f1bef9
|
||||||
Unable%20to%20delete%20checklist/singular: d7067e2c009f4919f0cca77df3c228ee
|
|
||||||
Unable%20to%20delete%20checklist%20item/singular: a74144593b625e4d8d7ecf734462c60d
|
|
||||||
Unable%20to%20delete%20comment/singular: 550198b2c87f06726a843c79c1026ed9
|
Unable%20to%20delete%20comment/singular: 550198b2c87f06726a843c79c1026ed9
|
||||||
Unable%20to%20remove%20member/singular: 39025a0c53818438829603d213baef06
|
Unable%20to%20remove%20member/singular: 39025a0c53818438829603d213baef06
|
||||||
Unable%20to%20send%20feedback/singular: 656c93265d7e2bef1245b17d85f85ae5
|
Unable%20to%20send%20feedback/singular: 656c93265d7e2bef1245b17d85f85ae5
|
||||||
Unable%20to%20update%20board%20URL/singular: 080746884059142358b58d9a44ff7d93
|
Unable%20to%20update%20board%20URL/singular: 080746884059142358b58d9a44ff7d93
|
||||||
Unable%20to%20update%20board%20visibility/singular: a76a21d561b8943e9276e027a1e3f70d
|
Unable%20to%20update%20board%20visibility/singular: a76a21d561b8943e9276e027a1e3f70d
|
||||||
Unable%20to%20update%20card/singular: eca6002e57af8ec97324eae64e3b5731
|
Unable%20to%20update%20card/singular: eca6002e57af8ec97324eae64e3b5731
|
||||||
Unable%20to%20update%20checklist/singular: 44c10f49f448909ceca481ed9b4b07e7
|
|
||||||
Unable%20to%20update%20checklist%20item/singular: 5c86b3523531c30d58856e3ecde0cb55
|
|
||||||
Unable%20to%20update%20comment/singular: 05e798ed6b0f3fee41f3e8832eb699ea
|
Unable%20to%20update%20comment/singular: 05e798ed6b0f3fee41f3e8832eb699ea
|
||||||
Unable%20to%20update%20labels/singular: dca2bdc3dcf74bc9d95e05156039a291
|
Unable%20to%20update%20labels/singular: dca2bdc3dcf74bc9d95e05156039a291
|
||||||
Unable%20to%20update%20list/singular: 14aa802f91b9b4c05236c8c75afb33da
|
Unable%20to%20update%20list/singular: 14aa802f91b9b4c05236c8c75afb33da
|
||||||
Unable%20to%20update%20members/singular: 9a851a6b0c75ee16d25cf2ff4b67b255
|
Unable%20to%20update%20members/singular: 9a851a6b0c75ee16d25cf2ff4b67b255
|
||||||
unassigned%20%3C0%3E%7B0%7D%3C%2F0%3E%20from%20the%20card/singular: b683cc07092348c1e75dba40b1262b85
|
unassigned%20%3C0%3E%7BmemberName%7D%3C%2F0%3E%20from%20the%20card/singular: 105d4eeb32044126b8dde243bad11d56
|
||||||
unassigned%20themselves%20from%20the%20card/singular: 27c6f293c562af6a44348d7f00036d30
|
unassigned%20themselves%20from%20the%20card/singular: 27c6f293c562af6a44348d7f00036d30
|
||||||
Unlimited%20activity%20log/singular: 8c993de94cda0deac19ba14ecafce6a5
|
Unlimited%20activity%20log/singular: 8c993de94cda0deac19ba14ecafce6a5
|
||||||
Unlimited%20boards/singular: cb4fd858137ce825c2f1904d142d8042
|
Unlimited%20boards/singular: cb4fd858137ce825c2f1904d142d8042
|
||||||
@@ -377,10 +349,9 @@ checksums:
|
|||||||
Unlimited%20lists/singular: 5c418701b27b9acbc5dd199719007362
|
Unlimited%20lists/singular: 5c418701b27b9acbc5dd199719007362
|
||||||
Update/singular: 079fc039262fd31b10532929685c2d1b
|
Update/singular: 079fc039262fd31b10532929685c2d1b
|
||||||
Update%20label/singular: 97880b503dfe956941c5f23025a1c102
|
Update%20label/singular: 97880b503dfe956941c5f23025a1c102
|
||||||
updated%20a%20checklist%20item/singular: 198e1d1d503f4b69b752dd84d0cc0e9d
|
|
||||||
updated%20the%20description/singular: 70fd604b6dc957a75be90ea77572d76d
|
updated%20the%20description/singular: 70fd604b6dc957a75be90ea77572d76d
|
||||||
updated%20the%20title/singular: 98cf8f12923ec1a58e767e3a40863b21
|
updated%20the%20title/singular: 98cf8f12923ec1a58e767e3a40863b21
|
||||||
updated%20the%20title%20to%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: aca196d729401d8adc5c8ca9d558840e
|
updated%20the%20title%20to%20%3C0%3E%7BtoTitle%7D%3C%2F0%3E/singular: 70cdf681ec2b6ef8e14397bc1f93f945
|
||||||
Upgrade/singular: 63c3b52882e0d779859307d672c178c2
|
Upgrade/singular: 63c3b52882e0d779859307d672c178c2
|
||||||
Urgent/singular: e79afcd4398e52e10e7e8243a7eecabe
|
Urgent/singular: e79afcd4398e52e10e7e8243a7eecabe
|
||||||
URL%20can%20only%20contain%20letters%2C%20numbers%2C%20and%20hyphens/singular: 875d37d2d920f98ef60a314eda8a5d9a
|
URL%20can%20only%20contain%20letters%2C%20numbers%2C%20and%20hyphens/singular: 875d37d2d920f98ef60a314eda8a5d9a
|
||||||
@@ -393,7 +364,6 @@ checksums:
|
|||||||
View%20and%20manage%20your%20API%20keys./singular: 88e23ee79056846dd9ce63ceee690549
|
View%20and%20manage%20your%20API%20keys./singular: 88e23ee79056846dd9ce63ceee690549
|
||||||
View%20and%20manage%20your%20billing%20and%20subscription./singular: 7469502543aac6f02149813546d1cb38
|
View%20and%20manage%20your%20billing%20and%20subscription./singular: 7469502543aac6f02149813546d1cb38
|
||||||
View%20docs/singular: 43ce54f27bb1e3f1880b56e03ab38871
|
View%20docs/singular: 43ce54f27bb1e3f1880b56e03ab38871
|
||||||
View%20only/singular: 21f5f7ba3b49050c4f406113479d6a7a
|
|
||||||
View%20our%20roadmap./singular: 1dd7ec80e1635951b1c90d592d1d07dc
|
View%20our%20roadmap./singular: 1dd7ec80e1635951b1c90d592d1d07dc
|
||||||
View%20workspace/singular: c9e4b789330b08c18ca8db7044409e5f
|
View%20workspace/singular: c9e4b789330b08c18ca8db7044409e5f
|
||||||
Visibility/singular: 1ff412f8fcde0f460acbf11153649646
|
Visibility/singular: 1ff412f8fcde0f460acbf11153649646
|
||||||
|
|||||||
@@ -33,7 +33,6 @@
|
|||||||
"@tailwindcss/typography": "^0.5.16",
|
"@tailwindcss/typography": "^0.5.16",
|
||||||
"@tanstack/react-query": "catalog:",
|
"@tanstack/react-query": "catalog:",
|
||||||
"@tiptap/extension-link": "^2.22.2",
|
"@tiptap/extension-link": "^2.22.2",
|
||||||
"@tiptap/extension-mention": "^3.0.9",
|
|
||||||
"@tiptap/extension-placeholder": "^2.14.0",
|
"@tiptap/extension-placeholder": "^2.14.0",
|
||||||
"@tiptap/pm": "^2.14.0",
|
"@tiptap/pm": "^2.14.0",
|
||||||
"@tiptap/react": "^2.14.0",
|
"@tiptap/react": "^2.14.0",
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import LoadingSpinner from "./LoadingSpinner";
|
|||||||
|
|
||||||
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
||||||
variant?: "primary" | "secondary" | "danger" | "ghost";
|
variant?: "primary" | "secondary" | "danger" | "ghost";
|
||||||
size?: "xs" | "sm" | "md" | "lg";
|
size?: "sm" | "md" | "lg";
|
||||||
isLoading?: boolean;
|
isLoading?: boolean;
|
||||||
iconLeft?: React.ReactNode;
|
iconLeft?: React.ReactNode;
|
||||||
iconRight?: React.ReactNode;
|
iconRight?: React.ReactNode;
|
||||||
@@ -28,7 +28,6 @@ const Button = ({
|
|||||||
}: ButtonProps) => {
|
}: ButtonProps) => {
|
||||||
const classes = twMerge(
|
const classes = twMerge(
|
||||||
"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-2 text-sm font-semibold text-light-50 shadow-sm focus-visible:outline-none",
|
"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-2 text-sm font-semibold text-light-50 shadow-sm focus-visible:outline-none",
|
||||||
size === "xs" && "text-xs px-2 py-1",
|
|
||||||
size === "sm" && "text-xs",
|
size === "sm" && "text-xs",
|
||||||
size === "lg" && "py-[0.65rem]",
|
size === "lg" && "py-[0.65rem]",
|
||||||
fullWidth && "w-full",
|
fullWidth && "w-full",
|
||||||
|
|||||||
@@ -1,58 +0,0 @@
|
|||||||
import { twMerge } from "tailwind-merge";
|
|
||||||
|
|
||||||
interface CircularProgressProps {
|
|
||||||
progress: number; // 0-100
|
|
||||||
size?: "sm" | "md" | "lg";
|
|
||||||
className?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const CircularProgress = ({
|
|
||||||
progress,
|
|
||||||
size = "md",
|
|
||||||
className,
|
|
||||||
}: CircularProgressProps) => {
|
|
||||||
const radius = 40;
|
|
||||||
const circumference = 2 * Math.PI * radius;
|
|
||||||
const strokeDashoffset = circumference - (progress / 100) * circumference;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className={twMerge("relative", className)}>
|
|
||||||
<svg
|
|
||||||
className={twMerge(
|
|
||||||
"-rotate-90 transform",
|
|
||||||
size === "sm" && "h-4 w-4",
|
|
||||||
size === "md" && "h-5 w-5",
|
|
||||||
size === "lg" && "h-8 w-8",
|
|
||||||
)}
|
|
||||||
viewBox="0 0 100 100"
|
|
||||||
>
|
|
||||||
<circle
|
|
||||||
cx="50"
|
|
||||||
cy="50"
|
|
||||||
r={radius}
|
|
||||||
fill="none"
|
|
||||||
stroke="currentColor"
|
|
||||||
strokeWidth="14"
|
|
||||||
className="text-light-300 dark:text-dark-400"
|
|
||||||
/>
|
|
||||||
<circle
|
|
||||||
cx="50"
|
|
||||||
cy="50"
|
|
||||||
r={radius}
|
|
||||||
fill="none"
|
|
||||||
stroke="currentColor"
|
|
||||||
strokeWidth="14"
|
|
||||||
strokeDasharray={circumference}
|
|
||||||
strokeDashoffset={strokeDashoffset}
|
|
||||||
strokeLinecap="round"
|
|
||||||
className={twMerge(
|
|
||||||
"transition-all duration-300 ease-in-out",
|
|
||||||
progress === 100 ? "text-green-500" : "text-blue-500",
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default CircularProgress;
|
|
||||||
@@ -12,14 +12,11 @@ export function DeleteLabelConfirmation({
|
|||||||
labelPublicId: string;
|
labelPublicId: string;
|
||||||
refetch: () => void;
|
refetch: () => void;
|
||||||
}) {
|
}) {
|
||||||
const { closeModal, closeModals } = useModal();
|
const { closeModal } = useModal();
|
||||||
const { showPopup } = usePopup();
|
const { showPopup } = usePopup();
|
||||||
|
|
||||||
const deleteLabelMutation = api.label.delete.useMutation({
|
const deleteLabelMutation = api.label.delete.useMutation({
|
||||||
onSuccess: () => {
|
onSuccess: () => refetch(),
|
||||||
refetch();
|
|
||||||
closeModals(2);
|
|
||||||
},
|
|
||||||
onError: () =>
|
onError: () =>
|
||||||
showPopup({
|
showPopup({
|
||||||
header: t`Error deleting label`,
|
header: t`Error deleting label`,
|
||||||
@@ -29,6 +26,7 @@ export function DeleteLabelConfirmation({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const handleDeleteLabel = () => {
|
const handleDeleteLabel = () => {
|
||||||
|
closeModal();
|
||||||
deleteLabelMutation.mutate({
|
deleteLabelMutation.mutate({
|
||||||
labelPublicId,
|
labelPublicId,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -15,15 +15,10 @@ import {
|
|||||||
ReactRenderer,
|
ReactRenderer,
|
||||||
useEditor,
|
useEditor,
|
||||||
} from "@tiptap/react";
|
} from "@tiptap/react";
|
||||||
|
import { useEffect } from "react";
|
||||||
import StarterKit from "@tiptap/starter-kit";
|
import StarterKit from "@tiptap/starter-kit";
|
||||||
import Suggestion from "@tiptap/suggestion";
|
import Suggestion from "@tiptap/suggestion";
|
||||||
import {
|
import { forwardRef, useImperativeHandle, useRef, useState } from "react";
|
||||||
forwardRef,
|
|
||||||
useEffect,
|
|
||||||
useImperativeHandle,
|
|
||||||
useRef,
|
|
||||||
useState,
|
|
||||||
} from "react";
|
|
||||||
import {
|
import {
|
||||||
HiH1,
|
HiH1,
|
||||||
HiH2,
|
HiH2,
|
||||||
@@ -39,9 +34,6 @@ import {
|
|||||||
} from "react-icons/hi2";
|
} from "react-icons/hi2";
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from "tailwind-merge";
|
||||||
import tippy from "tippy.js";
|
import tippy from "tippy.js";
|
||||||
import Mention from "@tiptap/extension-mention";
|
|
||||||
import Avatar from "./Avatar";
|
|
||||||
import { getAvatarUrl } from "~/utils/helpers";
|
|
||||||
|
|
||||||
declare module "@tiptap/core" {
|
declare module "@tiptap/core" {
|
||||||
interface Commands<ReturnType> {
|
interface Commands<ReturnType> {
|
||||||
@@ -77,16 +69,6 @@ export interface RenderSuggestionsProps {
|
|||||||
command: (item: SlashCommandItem) => void;
|
command: (item: SlashCommandItem) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type WorkspaceMember = {
|
|
||||||
publicId: string;
|
|
||||||
user: {
|
|
||||||
id: string;
|
|
||||||
name: string | null;
|
|
||||||
image: string | null;
|
|
||||||
} | null;
|
|
||||||
email: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
const CommandsList = forwardRef<
|
const CommandsList = forwardRef<
|
||||||
{ onKeyDown: (props: SuggestionKeyDownProps) => boolean },
|
{ onKeyDown: (props: SuggestionKeyDownProps) => boolean },
|
||||||
{
|
{
|
||||||
@@ -200,125 +182,6 @@ const RenderSuggestions = () => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
type MentionItem = { id: string; label: string; image: string | null };
|
|
||||||
|
|
||||||
const MentionList = forwardRef<
|
|
||||||
{ onKeyDown: (props: SuggestionKeyDownProps) => boolean },
|
|
||||||
{
|
|
||||||
items: MentionItem[];
|
|
||||||
command: (item: MentionItem) => void;
|
|
||||||
}
|
|
||||||
>(({ items, command }, ref) => {
|
|
||||||
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
||||||
|
|
||||||
useImperativeHandle(ref, () => ({
|
|
||||||
onKeyDown: ({ event }: SuggestionKeyDownProps) => {
|
|
||||||
if (event.key === "ArrowUp") {
|
|
||||||
setSelectedIndex((selectedIndex + items.length - 1) % items.length);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.key === "ArrowDown") {
|
|
||||||
setSelectedIndex((selectedIndex + 1) % items.length);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.key === "Enter") {
|
|
||||||
const item = items[selectedIndex];
|
|
||||||
if (item) {
|
|
||||||
command(item);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
}));
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="w-56 rounded-md border-[1px] border-light-200 bg-light-50 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-500 dark:bg-dark-200">
|
|
||||||
<div className="max-h-[350px] overflow-y-auto p-1 scrollbar-thin scrollbar-thumb-light-200 dark:scrollbar-thumb-dark-300">
|
|
||||||
{items.length > 0 ? items.map((item, index) => (
|
|
||||||
<button
|
|
||||||
key={item.id}
|
|
||||||
onClick={() => command(item)}
|
|
||||||
className={twMerge(
|
|
||||||
"group flex w-full items-center rounded-[5px] p-2 hover:bg-light-200 dark:hover:bg-dark-300",
|
|
||||||
index === selectedIndex && "bg-light-200 dark:bg-dark-300",
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
<Avatar
|
|
||||||
size="xs"
|
|
||||||
name={item.label}
|
|
||||||
imageUrl={
|
|
||||||
item.image ? getAvatarUrl(item.image) : undefined
|
|
||||||
}
|
|
||||||
email={item.label}
|
|
||||||
/>
|
|
||||||
<span className="ml-3 text-[12px] font-medium text-dark-900 dark:text-dark-1000">
|
|
||||||
{item.label}
|
|
||||||
</span>
|
|
||||||
</button>
|
|
||||||
)) : (
|
|
||||||
<div className="flex items-center justify-start p-2">
|
|
||||||
<span className="text-dark-900 text-[12px] dark:text-dark-1000">No results</span>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
MentionList.displayName = "MentionList";
|
|
||||||
|
|
||||||
const renderMentionSuggestions = () => {
|
|
||||||
let reactRenderer: ReactRenderer;
|
|
||||||
let popup: TippyInstance[];
|
|
||||||
|
|
||||||
return {
|
|
||||||
onStart: (props: any) => {
|
|
||||||
reactRenderer = new ReactRenderer(MentionList, {
|
|
||||||
props,
|
|
||||||
editor: props.editor,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!props.clientRect) return;
|
|
||||||
|
|
||||||
popup = tippy("body", {
|
|
||||||
getReferenceClientRect: props.clientRect,
|
|
||||||
appendTo: () => document.body,
|
|
||||||
content: reactRenderer.element,
|
|
||||||
showOnCreate: true,
|
|
||||||
interactive: true,
|
|
||||||
trigger: "manual",
|
|
||||||
placement: "bottom-start",
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onUpdate(props: any) {
|
|
||||||
reactRenderer.updateProps(props);
|
|
||||||
if (!props.clientRect) return;
|
|
||||||
popup[0]?.setProps({ getReferenceClientRect: props.clientRect });
|
|
||||||
},
|
|
||||||
onKeyDown(props: SuggestionKeyDownProps) {
|
|
||||||
if (props.event.key === "Escape") {
|
|
||||||
popup[0]?.hide();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
(
|
|
||||||
reactRenderer.ref as {
|
|
||||||
onKeyDown?: (props: SuggestionKeyDownProps) => boolean;
|
|
||||||
}
|
|
||||||
).onKeyDown?.(props) ?? false
|
|
||||||
);
|
|
||||||
},
|
|
||||||
onExit() {
|
|
||||||
popup[0]?.destroy();
|
|
||||||
reactRenderer.destroy();
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
const SlashCommands = Extension.create<SlashCommandsOptions>({
|
const SlashCommands = Extension.create<SlashCommandsOptions>({
|
||||||
name: "slash-commands",
|
name: "slash-commands",
|
||||||
addOptions() {
|
addOptions() {
|
||||||
@@ -422,13 +285,11 @@ export default function Editor({
|
|||||||
onChange,
|
onChange,
|
||||||
onBlur,
|
onBlur,
|
||||||
readOnly = false,
|
readOnly = false,
|
||||||
workspaceMembers,
|
|
||||||
}: {
|
}: {
|
||||||
content: string | null;
|
content: string | null;
|
||||||
onChange?: (value: string) => void;
|
onChange?: (value: string) => void;
|
||||||
onBlur?: () => void;
|
onBlur?: () => void;
|
||||||
readOnly?: boolean;
|
readOnly?: boolean;
|
||||||
workspaceMembers: WorkspaceMember[];
|
|
||||||
}) {
|
}) {
|
||||||
const containerRef = useRef<HTMLDivElement>(null);
|
const containerRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
@@ -439,7 +300,7 @@ export default function Editor({
|
|||||||
Placeholder.configure({
|
Placeholder.configure({
|
||||||
placeholder: readOnly
|
placeholder: readOnly
|
||||||
? ""
|
? ""
|
||||||
: t`Add description... (type '/' to open commands or '@' to mention)`,
|
: t`Add description... (type '/' to open commands)`,
|
||||||
}),
|
}),
|
||||||
Link.configure({
|
Link.configure({
|
||||||
openOnClick: true,
|
openOnClick: true,
|
||||||
@@ -460,38 +321,6 @@ export default function Editor({
|
|||||||
char: "/",
|
char: "/",
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
Mention.configure({
|
|
||||||
HTMLAttributes: {
|
|
||||||
class: 'mention',
|
|
||||||
},
|
|
||||||
suggestion: {
|
|
||||||
char: "@",
|
|
||||||
items: ({ query }: { query: string }) => {
|
|
||||||
const all: MentionItem[] = workspaceMembers.map((member: WorkspaceMember) => ({
|
|
||||||
id: member.publicId,
|
|
||||||
label: member?.user?.name ?? member.email,
|
|
||||||
image: member?.user?.image ?? null,
|
|
||||||
}));
|
|
||||||
const q = query.toLowerCase();
|
|
||||||
return all.filter((u) => u.label.toLowerCase().includes(q));
|
|
||||||
},
|
|
||||||
command: ({ editor, range, props }: any) => {
|
|
||||||
const mentionHTML = `<span data-type="mention" data-id="${props.id}" data-label="${props.label}">@${props.label}</span> `;
|
|
||||||
|
|
||||||
editor
|
|
||||||
.chain()
|
|
||||||
.focus()
|
|
||||||
.deleteRange(range)
|
|
||||||
.insertContent(mentionHTML)
|
|
||||||
.focus()
|
|
||||||
.run();
|
|
||||||
},
|
|
||||||
render: renderMentionSuggestions,
|
|
||||||
},
|
|
||||||
renderText({ options, node }) {
|
|
||||||
return `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`;
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
],
|
],
|
||||||
content,
|
content,
|
||||||
onUpdate: ({ editor }) => onChange?.(editor.getHTML()),
|
onUpdate: ({ editor }) => onChange?.(editor.getHTML()),
|
||||||
@@ -540,19 +369,11 @@ export default function Editor({
|
|||||||
.tiptap p {
|
.tiptap p {
|
||||||
margin: 0 0 1rem 0 !important;
|
margin: 0 0 1rem 0 !important;
|
||||||
}
|
}
|
||||||
.tiptap .mention {
|
|
||||||
background-color: rgba(59, 130, 246, 0.1);
|
|
||||||
border-radius: 0.25rem;
|
|
||||||
padding: 0.125rem 0.25rem;
|
|
||||||
color: rgb(59, 130, 246);
|
|
||||||
text-decoration: none;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
`}</style>
|
`}</style>
|
||||||
{!readOnly && editor && <EditorBubbleMenu editor={editor} />}
|
{!readOnly && editor && <EditorBubbleMenu editor={editor} />}
|
||||||
<EditorContent
|
<EditorContent
|
||||||
editor={editor}
|
editor={editor}
|
||||||
className="prose dark:prose-invert prose-sm max-w-none overflow-y-auto [&_blockquote]:!text-xs [&_h1]:!text-lg [&_h2]:!text-base [&_h3]:!text-sm [&_ol]:!text-xs [&_p.is-empty::before]:text-light-900 [&_p.is-empty::before]:dark:text-dark-800 [&_p]:!text-sm [&_p]:text-light-950 [&_p]:dark:text-dark-950 [&_ul]:!text-xs"
|
className="prose dark:prose-invert prose-sm max-w-none overflow-y-auto [&_blockquote]:!text-xs [&_h1]:!text-lg [&_h2]:!text-base [&_h3]:!text-sm [&_ol]:!text-xs [&_p.is-empty::before]:text-light-900 [&_p.is-empty::before]:dark:text-dark-800 [&_p]:!text-sm [&_p]:text-black [&_p]:dark:text-white [&_ul]:!text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ export function LabelForm({
|
|||||||
refetch: () => void;
|
refetch: () => void;
|
||||||
isEdit?: boolean;
|
isEdit?: boolean;
|
||||||
}) {
|
}) {
|
||||||
const { closeModal, entityId, openModal, setModalState } = useModal();
|
const { closeModal, entityId, openModal } = useModal();
|
||||||
|
|
||||||
const label = api.label.byPublicId.useQuery(
|
const label = api.label.byPublicId.useQuery(
|
||||||
{
|
{
|
||||||
@@ -57,13 +57,12 @@ export function LabelForm({
|
|||||||
const isCreateAnotherEnabled = watch("isCreateAnotherEnabled");
|
const isCreateAnotherEnabled = watch("isCreateAnotherEnabled");
|
||||||
|
|
||||||
const createLabel = api.label.create.useMutation({
|
const createLabel = api.label.create.useMutation({
|
||||||
onSuccess: (newLabel) => {
|
onSuccess: () => {
|
||||||
const currentColourIndex = colours.findIndex(
|
const currentColourIndex = colours.findIndex(
|
||||||
(c) => c.code === watch("colour").code,
|
(c) => c.code === watch("colour").code,
|
||||||
);
|
);
|
||||||
try {
|
try {
|
||||||
refetch();
|
refetch();
|
||||||
setModalState("NEW_LABEL_CREATED", newLabel.publicId);
|
|
||||||
if (!isCreateAnotherEnabled) {
|
if (!isCreateAnotherEnabled) {
|
||||||
closeModal();
|
closeModal();
|
||||||
} else {
|
} else {
|
||||||
@@ -221,7 +220,6 @@ export function LabelForm({
|
|||||||
<div className="space-x-2">
|
<div className="space-x-2">
|
||||||
{isEdit && (
|
{isEdit && (
|
||||||
<Button
|
<Button
|
||||||
type="button"
|
|
||||||
variant="secondary"
|
variant="secondary"
|
||||||
onClick={() => openModal("DELETE_LABEL", entityId)}
|
onClick={() => openModal("DELETE_LABEL", entityId)}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ export const env = createEnv({
|
|||||||
s.split(",").every((l) => z.string().url().safeParse(l).success),
|
s.split(",").every((l) => z.string().url().safeParse(l).success),
|
||||||
)
|
)
|
||||||
.optional(),
|
.optional(),
|
||||||
POSTGRES_URL: z.string().url().optional().or(z.literal("")),
|
POSTGRES_URL: z.string().url(),
|
||||||
TRELLO_APP_API_KEY: z.string().optional(),
|
TRELLO_APP_API_KEY: z.string().optional(),
|
||||||
TRELLO_APP_SECRET: z.string().optional(),
|
TRELLO_APP_SECRET: z.string().optional(),
|
||||||
STRIPE_SECRET_KEY: z.string().optional(),
|
STRIPE_SECRET_KEY: z.string().optional(),
|
||||||
@@ -101,13 +101,6 @@ export const env = createEnv({
|
|||||||
(s) => !s || s.toLowerCase() === "true" || s.toLowerCase() === "false",
|
(s) => !s || s.toLowerCase() === "true" || s.toLowerCase() === "false",
|
||||||
)
|
)
|
||||||
.optional(),
|
.optional(),
|
||||||
NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY: z
|
|
||||||
.string()
|
|
||||||
.transform((s) => (s === "" ? undefined : s))
|
|
||||||
.refine(
|
|
||||||
(s) => !s || s.toLowerCase() === "true" || s.toLowerCase() === "false",
|
|
||||||
)
|
|
||||||
.optional(),
|
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* Destructure all variables from `process.env` to make sure they aren't tree-shaken away.
|
* Destructure all variables from `process.env` to make sure they aren't tree-shaken away.
|
||||||
@@ -126,8 +119,6 @@ export const env = createEnv({
|
|||||||
NEXT_PUBLIC_DISABLE_SIGN_UP: process.env.NEXT_PUBLIC_DISABLE_SIGN_UP,
|
NEXT_PUBLIC_DISABLE_SIGN_UP: process.env.NEXT_PUBLIC_DISABLE_SIGN_UP,
|
||||||
NEXT_PUBLIC_USE_STANDALONE_OUTPUT:
|
NEXT_PUBLIC_USE_STANDALONE_OUTPUT:
|
||||||
process.env.NEXT_PUBLIC_USE_STANDALONE_OUTPUT,
|
process.env.NEXT_PUBLIC_USE_STANDALONE_OUTPUT,
|
||||||
NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY:
|
|
||||||
process.env.NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY,
|
|
||||||
},
|
},
|
||||||
skipValidation:
|
skipValidation:
|
||||||
!!process.env.CI || process.env.npm_lifecycle_event === "lint",
|
!!process.env.CI || process.env.npm_lifecycle_event === "lint",
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Plural-Forms: \n"
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:123
|
#: src/views/card/components/Comment.tsx:121
|
||||||
msgid " (edited)"
|
msgid " (edited)"
|
||||||
msgstr " (bearbeitet)"
|
msgstr " (bearbeitet)"
|
||||||
|
|
||||||
@@ -23,12 +23,12 @@ msgstr ", oder besuche unsere"
|
|||||||
|
|
||||||
#. placeholder {0}: card?.title ?? "Card"
|
#. placeholder {0}: card?.title ?? "Card"
|
||||||
#. placeholder {1}: board?.name ?? "Board"
|
#. placeholder {1}: board?.name ?? "Board"
|
||||||
#: src/views/card/index.tsx:214
|
#: src/views/card/index.tsx:189
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
#. placeholder {0}: labelPublicIds.length
|
#. placeholder {0}: labelPublicIds.length
|
||||||
#: src/views/board/components/NewCardForm.tsx:432
|
#: src/views/board/components/NewCardForm.tsx:392
|
||||||
msgid "{0} labels"
|
msgid "{0} labels"
|
||||||
msgstr "{0} Labels"
|
msgstr "{0} Labels"
|
||||||
|
|
||||||
@@ -48,8 +48,8 @@ msgstr "Eine leistungsstarke, flexible Kanban-App, die dir hilft, Arbeit zu orga
|
|||||||
msgid "Account deleted"
|
msgid "Account deleted"
|
||||||
msgstr "Konto gelöscht"
|
msgstr "Konto gelöscht"
|
||||||
|
|
||||||
#: src/views/public/board/CardModal.tsx:140
|
#: src/views/public/board/CardModal.tsx:104
|
||||||
#: src/views/card/index.tsx:288
|
#: src/views/card/index.tsx:256
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Aktivität"
|
msgstr "Aktivität"
|
||||||
|
|
||||||
@@ -62,25 +62,13 @@ msgid "Add a card"
|
|||||||
msgstr "Karte hinzufügen"
|
msgstr "Karte hinzufügen"
|
||||||
|
|
||||||
#: src/views/card/components/NewCommentForm.tsx:57
|
#: src/views/card/components/NewCommentForm.tsx:57
|
||||||
#: src/views/card/components/Comment.tsx:146
|
#: src/views/card/components/Comment.tsx:144
|
||||||
msgid "Add a comment..."
|
msgid "Add a comment..."
|
||||||
msgstr "Kommentar hinzufügen..."
|
msgstr "Kommentar hinzufügen..."
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:140
|
#: src/components/Editor.tsx:303
|
||||||
msgid "Add an item..."
|
msgid "Add description... (type '/' to open commands)"
|
||||||
msgstr "Element hinzufügen..."
|
msgstr "Beschreibung hinzufügen... (tippe '/' um Befehle zu öffnen)"
|
||||||
|
|
||||||
#: src/views/card/components/Dropdown.tsx:18
|
|
||||||
msgid "Add checklist"
|
|
||||||
msgstr "Checkliste hinzufügen"
|
|
||||||
|
|
||||||
#: src/components/Editor.tsx:442
|
|
||||||
msgid "Add description... (type '/' to open commands or '@' to mention)"
|
|
||||||
msgstr "Beschreibung hinzufügen... (tippe '/' um Befehle zu öffnen oder '@' um jemanden zu erwähnen)"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:172
|
|
||||||
msgid "Add details..."
|
|
||||||
msgstr "Details hinzufügen..."
|
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:110
|
#: src/views/card/components/LabelSelector.tsx:110
|
||||||
#: src/views/card/components/LabelSelector.tsx:118
|
#: src/views/card/components/LabelSelector.tsx:118
|
||||||
@@ -92,36 +80,17 @@ msgstr "Label hinzufügen"
|
|||||||
msgid "Add member"
|
msgid "Add member"
|
||||||
msgstr "Mitglied hinzufügen"
|
msgstr "Mitglied hinzufügen"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:69
|
#: src/views/card/components/ActivityList.tsx:56
|
||||||
msgid "added a checklist"
|
|
||||||
msgstr "hat eine Checkliste hinzugefügt"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:72
|
|
||||||
msgid "added a checklist item"
|
|
||||||
msgstr "hat ein Checklistenelement hinzugefügt"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:65
|
|
||||||
msgid "added a label to the card"
|
msgid "added a label to the card"
|
||||||
msgstr "hat ein Label zur Karte hinzugefügt"
|
msgstr "hat ein Label zur Karte hinzugefügt"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:67
|
#: src/views/card/components/ActivityList.tsx:58
|
||||||
msgid "added a member to the card"
|
msgid "added a member to the card"
|
||||||
msgstr "hat ein Mitglied zur Karte hinzugefügt"
|
msgstr "hat ein Mitglied zur Karte hinzugefügt"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
#: src/views/card/components/ActivityList.tsx:110
|
||||||
#: src/views/card/components/ActivityList.tsx:146
|
msgid "added label <0>{label}</0>"
|
||||||
msgid "added checklist <0>{0}</0>"
|
msgstr "hat Label <0>{label}</0> hinzugefügt"
|
||||||
msgstr "hat Checkliste <0>{0}</0> hinzugefügt"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:170
|
|
||||||
msgid "added checklist item <0>{0}</0>"
|
|
||||||
msgstr "hat Checklistenelement <0>{0}</0> hinzugefügt"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(label)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:130
|
|
||||||
msgid "added label <0>{0}</0>"
|
|
||||||
msgstr "hat Label <0>{0}</0> hinzugefügt"
|
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:55
|
#: src/views/home/components/Pricing.tsx:55
|
||||||
msgid "Admin roles"
|
msgid "Admin roles"
|
||||||
@@ -172,15 +141,11 @@ msgstr "Bist du sicher, dass du den Workspace {0} löschen möchtest?"
|
|||||||
msgid "Are you sure you want to delete this card?"
|
msgid "Are you sure you want to delete this card?"
|
||||||
msgstr "Bist du sicher, dass du diese Karte löschen möchtest?"
|
msgstr "Bist du sicher, dass du diese Karte löschen möchtest?"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
|
|
||||||
msgid "Are you sure you want to delete this checklist?"
|
|
||||||
msgstr "Sind Sie sicher, dass Sie diese Checkliste löschen möchten?"
|
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
|
||||||
msgid "Are you sure you want to delete this comment?"
|
msgid "Are you sure you want to delete this comment?"
|
||||||
msgstr "Bist du sicher, dass du diesen Kommentar löschen möchtest?"
|
msgstr "Bist du sicher, dass du diesen Kommentar löschen möchtest?"
|
||||||
|
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:41
|
#: src/components/DeleteLabelConfirmation.tsx:39
|
||||||
msgid "Are you sure you want to delete this label?"
|
msgid "Are you sure you want to delete this label?"
|
||||||
msgstr "Sind Sie sicher, dass Sie dieses Label löschen möchten?"
|
msgstr "Sind Sie sicher, dass Sie dieses Label löschen möchten?"
|
||||||
|
|
||||||
@@ -188,10 +153,9 @@ msgstr "Sind Sie sicher, dass Sie dieses Label löschen möchten?"
|
|||||||
msgid "Are you sure you want to delete your account?"
|
msgid "Are you sure you want to delete your account?"
|
||||||
msgstr "Bist du sicher, dass du dein Konto löschen möchtest?"
|
msgstr "Bist du sicher, dass du dein Konto löschen möchtest?"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(memberName)
|
#: src/views/card/components/ActivityList.tsx:92
|
||||||
#: src/views/card/components/ActivityList.tsx:110
|
msgid "assigned <0>{memberName}</0> to the card"
|
||||||
msgid "assigned <0>{0}</0> to the card"
|
msgstr "hat <0>{memberName}</0> der Karte zugewiesen"
|
||||||
msgstr "hat <0>{0}</0> der Karte zugewiesen"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:46
|
#: src/views/boards/components/TemplateBoards.tsx:46
|
||||||
msgid "Awaiting Customer"
|
msgid "Awaiting Customer"
|
||||||
@@ -218,7 +182,7 @@ msgstr "Abrechnungsportal"
|
|||||||
msgid "Blog Post"
|
msgid "Blog Post"
|
||||||
msgstr "Blogbeitrag"
|
msgstr "Blogbeitrag"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:331
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Board"
|
msgstr "Board"
|
||||||
|
|
||||||
@@ -230,8 +194,8 @@ msgstr "Der Name des Boards darf 100 Zeichen nicht überschreiten"
|
|||||||
msgid "Board name is required"
|
msgid "Board name is required"
|
||||||
msgstr "Boardname ist erforderlich"
|
msgstr "Boardname ist erforderlich"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:143
|
#: src/views/public/board/index.tsx:137
|
||||||
#: src/views/board/index.tsx:357
|
#: src/views/board/index.tsx:358
|
||||||
msgid "Board not found"
|
msgid "Board not found"
|
||||||
msgstr "Board nicht gefunden"
|
msgstr "Board nicht gefunden"
|
||||||
|
|
||||||
@@ -286,18 +250,17 @@ msgstr "Fehlerbericht"
|
|||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
||||||
#: src/views/card/components/Comment.tsx:158
|
#: src/views/card/components/Comment.tsx:156
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:49
|
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Abbrechen"
|
msgstr "Abbrechen"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:259
|
#: src/views/card/index.tsx:234
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Karte nicht gefunden"
|
msgstr "Karte nicht gefunden"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:307
|
#: src/views/board/components/NewCardForm.tsx:278
|
||||||
msgid "Card title"
|
msgid "Card title"
|
||||||
msgstr "Kartentitel"
|
msgstr "Kartentitel"
|
||||||
|
|
||||||
@@ -310,10 +273,6 @@ msgstr "Ändere die Sprache der App."
|
|||||||
msgid "Check your inbox"
|
msgid "Check your inbox"
|
||||||
msgstr "Überprüfe deinen Posteingang"
|
msgstr "Überprüfe deinen Posteingang"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:118
|
|
||||||
msgid "Checklist name"
|
|
||||||
msgstr "Checklistenname"
|
|
||||||
|
|
||||||
#: src/views/board/components/Filters.tsx:155
|
#: src/views/board/components/Filters.tsx:155
|
||||||
msgid "Clear filters"
|
msgid "Clear filters"
|
||||||
msgstr "Filter löschen"
|
msgstr "Filter löschen"
|
||||||
@@ -351,15 +310,6 @@ msgstr "Abgeschlossen"
|
|||||||
msgid "Complete control and ownership:"
|
msgid "Complete control and ownership:"
|
||||||
msgstr "Vollständige Kontrolle und Eigentum:"
|
msgstr "Vollständige Kontrolle und Eigentum:"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:74
|
|
||||||
msgid "completed a checklist item"
|
|
||||||
msgstr "hat ein Checklistenelement abgeschlossen"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:187
|
|
||||||
msgid "completed checklist item <0>{0}</0>"
|
|
||||||
msgstr "hat Checklistenelement <0>{0}</0> abgeschlossen"
|
|
||||||
|
|
||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:42
|
#: src/views/settings/components/CustomURLConfirmation.tsx:42
|
||||||
msgid "Confirm URL change"
|
msgid "Confirm URL change"
|
||||||
msgstr "URL-Änderung bestätigen"
|
msgstr "URL-Änderung bestätigen"
|
||||||
@@ -403,8 +353,8 @@ msgid "Control who can view and edit your boards."
|
|||||||
msgstr "Kontrolliere, wer deine Boards ansehen und bearbeiten kann."
|
msgstr "Kontrolliere, wer deine Boards ansehen und bearbeiten kann."
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:140
|
#: src/views/board/components/NewListForm.tsx:140
|
||||||
#: src/views/board/components/NewCardForm.tsx:458
|
#: src/views/board/components/NewCardForm.tsx:418
|
||||||
#: src/components/LabelForm.tsx:213
|
#: src/components/LabelForm.tsx:212
|
||||||
msgid "Create another"
|
msgid "Create another"
|
||||||
msgstr "Weitere erstellen"
|
msgstr "Weitere erstellen"
|
||||||
|
|
||||||
@@ -412,15 +362,11 @@ msgstr "Weitere erstellen"
|
|||||||
msgid "Create board"
|
msgid "Create board"
|
||||||
msgstr "Board erstellen"
|
msgstr "Board erstellen"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:468
|
#: src/views/board/components/NewCardForm.tsx:428
|
||||||
msgid "Create card"
|
msgid "Create card"
|
||||||
msgstr "Karte erstellen"
|
msgstr "Karte erstellen"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:134
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Create checklist"
|
|
||||||
msgstr "Checkliste erstellen"
|
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:238
|
|
||||||
msgid "Create label"
|
msgid "Create label"
|
||||||
msgstr "Label erstellen"
|
msgstr "Label erstellen"
|
||||||
|
|
||||||
@@ -437,11 +383,11 @@ msgid "Create new key"
|
|||||||
msgstr "Neuen Schlüssel erstellen"
|
msgstr "Neuen Schlüssel erstellen"
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:98
|
#: src/views/card/components/LabelSelector.tsx:98
|
||||||
#: src/views/board/components/NewCardForm.tsx:394
|
#: src/views/board/components/NewCardForm.tsx:354
|
||||||
msgid "Create new label"
|
msgid "Create new label"
|
||||||
msgstr "Neues Label erstellen"
|
msgstr "Neues Label erstellen"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:425
|
#: src/views/board/index.tsx:426
|
||||||
msgid "Create new list"
|
msgid "Create new list"
|
||||||
msgstr "Neue Liste erstellen"
|
msgstr "Neue Liste erstellen"
|
||||||
|
|
||||||
@@ -450,7 +396,7 @@ msgstr "Neue Liste erstellen"
|
|||||||
msgid "Create workspace"
|
msgid "Create workspace"
|
||||||
msgstr "Arbeitsbereich erstellen"
|
msgstr "Arbeitsbereich erstellen"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:61
|
#: src/views/card/components/ActivityList.tsx:52
|
||||||
msgid "created the card"
|
msgid "created the card"
|
||||||
msgstr "hat die Karte erstellt"
|
msgstr "hat die Karte erstellt"
|
||||||
|
|
||||||
@@ -475,10 +421,9 @@ msgid "Dark"
|
|||||||
msgstr "Dunkel"
|
msgstr "Dunkel"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||||
#: src/components/LabelForm.tsx:228
|
#: src/components/LabelForm.tsx:226
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:51
|
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Löschen"
|
msgstr "Löschen"
|
||||||
|
|
||||||
@@ -492,11 +437,11 @@ msgstr "Konto löschen"
|
|||||||
msgid "Delete board"
|
msgid "Delete board"
|
||||||
msgstr "Board löschen"
|
msgstr "Board löschen"
|
||||||
|
|
||||||
#: src/views/card/components/Dropdown.tsx:25
|
#: src/views/card/components/Dropdown.tsx:14
|
||||||
msgid "Delete card"
|
msgid "Delete card"
|
||||||
msgstr "Karte löschen"
|
msgstr "Karte löschen"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:91
|
#: src/views/card/components/Comment.tsx:89
|
||||||
msgid "Delete comment"
|
msgid "Delete comment"
|
||||||
msgstr "Kommentar löschen"
|
msgstr "Kommentar löschen"
|
||||||
|
|
||||||
@@ -510,24 +455,6 @@ msgstr "Liste löschen"
|
|||||||
msgid "Delete workspace"
|
msgid "Delete workspace"
|
||||||
msgstr "Workspace löschen"
|
msgstr "Workspace löschen"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:71
|
|
||||||
msgid "deleted a checklist"
|
|
||||||
msgstr "hat eine Checkliste gelöscht"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:76
|
|
||||||
msgid "deleted a checklist item"
|
|
||||||
msgstr "hat ein Checklistenelement gelöscht"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:162
|
|
||||||
msgid "deleted checklist <0>{0}</0>"
|
|
||||||
msgstr "hat Checkliste <0>{0}</0> gelöscht"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:205
|
|
||||||
msgid "deleted checklist item <0>{0}</0>"
|
|
||||||
msgstr "hat Checklistenelement <0>{0}</0> gelöscht"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:32
|
#: src/views/boards/components/TemplateBoards.tsx:32
|
||||||
msgid "Design"
|
msgid "Design"
|
||||||
msgstr "Design"
|
msgstr "Design"
|
||||||
@@ -590,11 +517,11 @@ msgstr "Erledigt"
|
|||||||
msgid "Edit board URL"
|
msgid "Edit board URL"
|
||||||
msgstr "Board-URL bearbeiten"
|
msgstr "Board-URL bearbeiten"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:82
|
#: src/views/card/components/Comment.tsx:80
|
||||||
msgid "Edit comment"
|
msgid "Edit comment"
|
||||||
msgstr "Kommentar bearbeiten"
|
msgstr "Kommentar bearbeiten"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:119
|
#: src/components/LabelForm.tsx:118
|
||||||
msgid "Edit label"
|
msgid "Edit label"
|
||||||
msgstr "Label bearbeiten"
|
msgstr "Label bearbeiten"
|
||||||
|
|
||||||
@@ -634,7 +561,7 @@ msgstr "Gib dein Passwort ein"
|
|||||||
msgid "Error deleting account"
|
msgid "Error deleting account"
|
||||||
msgstr "Fehler beim Löschen des Kontos"
|
msgstr "Fehler beim Löschen des Kontos"
|
||||||
|
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:25
|
#: src/components/DeleteLabelConfirmation.tsx:22
|
||||||
msgid "Error deleting label"
|
msgid "Error deleting label"
|
||||||
msgstr "Fehler beim Löschen des Labels"
|
msgstr "Fehler beim Löschen des Labels"
|
||||||
|
|
||||||
@@ -733,6 +660,7 @@ msgstr "Finden Sie Antworten auf häufige Fragen zum Projekt. Nicht gefunden, wo
|
|||||||
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
|
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
|
||||||
msgstr "Für langfristige Nachhaltigkeit erkennen wir an, dass alle guten Open-Source-Projekte eine Einnahmequelle benötigen. Unsere stammt aus dem kostenpflichtigen Cloud-Angebot für Workspaces mit mehreren Benutzern (kostenlos während der Beta-Phase) und für benutzerdefinierte Workspace-Slugs. Es besteht keine Verpflichtung, dieses Angebot zu nutzen, und Sie können die Software kostenlos auf Ihrer eigenen Infrastruktur selbst hosten."
|
msgstr "Für langfristige Nachhaltigkeit erkennen wir an, dass alle guten Open-Source-Projekte eine Einnahmequelle benötigen. Unsere stammt aus dem kostenpflichtigen Cloud-Angebot für Workspaces mit mehreren Benutzern (kostenlos während der Beta-Phase) und für benutzerdefinierte Workspace-Slugs. Es besteht keine Verpflichtung, dieses Angebot zu nutzen, und Sie können die Software kostenlos auf Ihrer eigenen Infrastruktur selbst hosten."
|
||||||
|
|
||||||
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
#: src/views/home/components/Pricing.tsx:32
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Kostenlos"
|
msgstr "Kostenlos"
|
||||||
@@ -765,7 +693,7 @@ msgstr "Loslegen"
|
|||||||
msgid "Get started by creating a new board"
|
msgid "Get started by creating a new board"
|
||||||
msgstr "Beginne, indem du ein neues Board erstellst"
|
msgstr "Beginne, indem du ein neues Board erstellst"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:417
|
#: src/views/board/index.tsx:418
|
||||||
msgid "Get started by creating a new list"
|
msgid "Get started by creating a new list"
|
||||||
msgstr "Beginne mit dem Erstellen einer neuen Liste"
|
msgstr "Beginne mit dem Erstellen einer neuen Liste"
|
||||||
|
|
||||||
@@ -922,8 +850,8 @@ msgstr "Kanban neu gedacht"
|
|||||||
msgid "Keep in mind that this action is irreversible."
|
msgid "Keep in mind that this action is irreversible."
|
||||||
msgstr "Beachten Sie, dass diese Aktion nicht rückgängig gemacht werden kann."
|
msgstr "Beachten Sie, dass diese Aktion nicht rückgängig gemacht werden kann."
|
||||||
|
|
||||||
#: src/views/card/index.tsx:118
|
#: src/views/card/index.tsx:113
|
||||||
#: src/views/board/components/NewCardForm.tsx:398
|
#: src/views/board/components/NewCardForm.tsx:358
|
||||||
#: src/views/board/components/Filters.tsx:101
|
#: src/views/board/components/Filters.tsx:101
|
||||||
msgid "Labels"
|
msgid "Labels"
|
||||||
msgstr "Labels"
|
msgstr "Labels"
|
||||||
@@ -956,7 +884,7 @@ msgstr "Hell"
|
|||||||
msgid "Link copied"
|
msgid "Link copied"
|
||||||
msgstr "Link kopiert"
|
msgstr "Link kopiert"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:110
|
#: src/views/card/index.tsx:105
|
||||||
msgid "List"
|
msgid "List"
|
||||||
msgstr "Liste"
|
msgstr "Liste"
|
||||||
|
|
||||||
@@ -984,22 +912,13 @@ msgstr "Niedrige Priorität"
|
|||||||
msgid "magic link"
|
msgid "magic link"
|
||||||
msgstr "Magic Link"
|
msgstr "Magic Link"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:75
|
|
||||||
msgid "marked a checklist item as incomplete"
|
|
||||||
msgstr "hat ein Checklistenelement als unvollständig markiert"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:196
|
|
||||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
|
||||||
msgstr "hat Checklistenelement <0>{0}</0> als unvollständig markiert"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:17
|
#: src/views/boards/components/TemplateBoards.tsx:17
|
||||||
msgid "Medium Priority"
|
msgid "Medium Priority"
|
||||||
msgstr "Mittlere Priorität"
|
msgstr "Mittlere Priorität"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:161
|
#: src/views/members/index.tsx:161
|
||||||
#: src/views/card/index.tsx:126
|
#: src/views/card/index.tsx:121
|
||||||
#: src/views/board/components/NewCardForm.tsx:357
|
#: src/views/board/components/NewCardForm.tsx:317
|
||||||
#: src/views/board/components/Filters.tsx:93
|
#: src/views/board/components/Filters.tsx:93
|
||||||
#: src/components/SideNavigation.tsx:73
|
#: src/components/SideNavigation.tsx:73
|
||||||
msgid "Members"
|
msgid "Members"
|
||||||
@@ -1014,18 +933,16 @@ msgstr "Mitglieder | {0}"
|
|||||||
msgid "Monthly"
|
msgid "Monthly"
|
||||||
msgstr "Monatlich"
|
msgstr "Monatlich"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromList)
|
#: src/views/card/components/ActivityList.tsx:81
|
||||||
#. placeholder {1}: truncate(toList)
|
msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||||
#: src/views/card/components/ActivityList.tsx:98
|
msgstr "hat die Karte von <0>{fromList}</0> nach <1>{toList}</1> verschoben"
|
||||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
|
||||||
msgstr "hat die Karte von <0>{0}</0> nach <1>{1}</1> verschoben"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:64
|
#: src/views/card/components/ActivityList.tsx:55
|
||||||
msgid "moved the card to another list"
|
msgid "moved the card to another list"
|
||||||
msgstr "hat die Karte in eine andere Liste verschoben"
|
msgstr "hat die Karte in eine andere Liste verschoben"
|
||||||
|
|
||||||
#: src/views/boards/components/NewBoardForm.tsx:99
|
#: src/views/boards/components/NewBoardForm.tsx:99
|
||||||
#: src/components/LabelForm.tsx:135
|
#: src/components/LabelForm.tsx:134
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
@@ -1041,23 +958,19 @@ msgstr "Neu"
|
|||||||
msgid "New board"
|
msgid "New board"
|
||||||
msgstr "Neues Board"
|
msgstr "Neues Board"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:290
|
#: src/views/board/components/NewCardForm.tsx:261
|
||||||
msgid "New card"
|
msgid "New card"
|
||||||
msgstr "Neue Karte"
|
msgstr "Neue Karte"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:102
|
|
||||||
msgid "New checklist"
|
|
||||||
msgstr "Neue Checkliste"
|
|
||||||
|
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
||||||
msgid "New import"
|
msgid "New import"
|
||||||
msgstr "Neuer Import"
|
msgstr "Neuer Import"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:119
|
#: src/components/LabelForm.tsx:118
|
||||||
msgid "New label"
|
msgid "New label"
|
||||||
msgstr "Neues Label"
|
msgstr "Neues Label"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:394
|
#: src/views/board/index.tsx:395
|
||||||
#: src/views/board/components/NewListForm.tsx:112
|
#: src/views/board/components/NewListForm.tsx:112
|
||||||
msgid "New list"
|
msgid "New list"
|
||||||
msgstr "Neue Liste"
|
msgstr "Neue Liste"
|
||||||
@@ -1090,7 +1003,7 @@ msgstr "Keine Boards gefunden"
|
|||||||
msgid "No credit card required"
|
msgid "No credit card required"
|
||||||
msgstr "Keine Kreditkarte erforderlich"
|
msgstr "Keine Kreditkarte erforderlich"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:414
|
#: src/views/board/index.tsx:415
|
||||||
msgid "No lists"
|
msgid "No lists"
|
||||||
msgstr "Keine Listen"
|
msgstr "Keine Listen"
|
||||||
|
|
||||||
@@ -1173,30 +1086,24 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
|
|||||||
#: src/views/settings/components/Avatar.tsx:98
|
#: src/views/settings/components/Avatar.tsx:98
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/card/index.tsx:173
|
#: src/views/card/index.tsx:159
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
|
||||||
#: src/views/card/components/MemberSelector.tsx:80
|
#: src/views/card/components/MemberSelector.tsx:80
|
||||||
#: src/views/card/components/ListSelector.tsx:53
|
#: src/views/card/components/ListSelector.tsx:53
|
||||||
#: src/views/card/components/LabelSelector.tsx:73
|
#: src/views/card/components/LabelSelector.tsx:73
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
||||||
#: src/views/card/components/Comment.tsx:64
|
#: src/views/card/components/Comment.tsx:62
|
||||||
#: src/views/card/components/ChecklistNameInput.tsx:46
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:60
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:88
|
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
||||||
#: src/views/board/index.tsx:134
|
#: src/views/board/index.tsx:135
|
||||||
#: src/views/board/index.tsx:190
|
#: src/views/board/index.tsx:191
|
||||||
#: src/views/board/components/VisibilityButton.tsx:53
|
#: src/views/board/components/VisibilityButton.tsx:53
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||||
#: src/views/board/components/NewListForm.tsx:78
|
#: src/views/board/components/NewListForm.tsx:78
|
||||||
#: src/views/board/components/NewCardForm.tsx:174
|
#: src/views/board/components/NewCardForm.tsx:145
|
||||||
#: src/components/NewWorkspaceForm.tsx:41
|
#: src/components/NewWorkspaceForm.tsx:41
|
||||||
#: src/components/FeedbackModal.tsx:41
|
#: src/components/FeedbackModal.tsx:41
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
#: src/components/DeleteLabelConfirmation.tsx:23
|
||||||
msgid "Please try again later, or contact customer support."
|
msgid "Please try again later, or contact customer support."
|
||||||
msgstr "Bitte versuche es später noch einmal oder kontaktiere den Kundensupport."
|
msgstr "Bitte versuche es später noch einmal oder kontaktiere den Kundensupport."
|
||||||
|
|
||||||
@@ -1262,32 +1169,17 @@ msgstr "Entfernen"
|
|||||||
msgid "Remove member"
|
msgid "Remove member"
|
||||||
msgstr "Mitglied entfernen"
|
msgstr "Mitglied entfernen"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:66
|
#: src/views/card/components/ActivityList.tsx:57
|
||||||
msgid "removed a label from the card"
|
msgid "removed a label from the card"
|
||||||
msgstr "hat ein Label von der Karte entfernt"
|
msgstr "hat ein Label von der Karte entfernt"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:68
|
#: src/views/card/components/ActivityList.tsx:59
|
||||||
msgid "removed a member from the card"
|
msgid "removed a member from the card"
|
||||||
msgstr "hat ein Mitglied von der Karte entfernt"
|
msgstr "hat ein Mitglied von der Karte entfernt"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(label)
|
#: src/views/card/components/ActivityList.tsx:118
|
||||||
#: src/views/card/components/ActivityList.tsx:138
|
msgid "removed label <0>{label}</0>"
|
||||||
msgid "removed label <0>{0}</0>"
|
msgstr "hat Label <0>{label}</0> entfernt"
|
||||||
msgstr "hat Label <0>{0}</0> entfernt"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:70
|
|
||||||
msgid "renamed a checklist"
|
|
||||||
msgstr "hat eine Checkliste umbenannt"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:154
|
|
||||||
msgid "renamed checklist <0>{0}</0>"
|
|
||||||
msgstr "hat Checkliste <0>{0}</0> umbenannt"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:178
|
|
||||||
msgid "renamed checklist item to <0>{0}</0>"
|
|
||||||
msgstr "hat Checklistenelement in <0>{0}</0> umbenannt"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:76
|
#: src/views/boards/components/TemplateBoards.tsx:76
|
||||||
msgid "Research"
|
msgid "Research"
|
||||||
@@ -1322,7 +1214,7 @@ msgstr "Rolle"
|
|||||||
msgid "Run on your own infrastructure"
|
msgid "Run on your own infrastructure"
|
||||||
msgstr "Auf eigener Infrastruktur betreiben"
|
msgstr "Auf eigener Infrastruktur betreiben"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:165
|
#: src/views/card/components/Comment.tsx:163
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Speichern"
|
msgstr "Speichern"
|
||||||
|
|
||||||
@@ -1350,7 +1242,7 @@ msgstr "Selbst hosten"
|
|||||||
msgid "Self host with Github"
|
msgid "Self host with Github"
|
||||||
msgstr "Selbst hosten mit Github"
|
msgstr "Selbst hosten mit Github"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:107
|
#: src/views/card/components/ActivityList.tsx:89
|
||||||
msgid "self-assigned the card"
|
msgid "self-assigned the card"
|
||||||
msgstr "hat sich selbst die Karte zugewiesen"
|
msgstr "hat sich selbst die Karte zugewiesen"
|
||||||
|
|
||||||
@@ -1469,13 +1361,12 @@ msgid "They won't be able to access this workspace."
|
|||||||
msgstr "Sie werden keinen Zugriff mehr auf diesen Workspace haben."
|
msgstr "Sie werden keinen Zugriff mehr auf diesen Workspace haben."
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:44
|
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||||
msgid "This action can't be undone."
|
msgid "This action can't be undone."
|
||||||
msgstr "Diese Aktion kann nicht rückgängig gemacht werden."
|
msgstr "Diese Aktion kann nicht rückgängig gemacht werden."
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:146
|
#: src/views/public/board/index.tsx:140
|
||||||
msgid "This board is private or does not exist"
|
msgid "This board is private or does not exist"
|
||||||
msgstr "Dieses Board ist privat oder existiert nicht"
|
msgstr "Dieses Board ist privat oder existiert nicht"
|
||||||
|
|
||||||
@@ -1520,22 +1411,14 @@ msgstr "Trello-importe"
|
|||||||
msgid "Triaging"
|
msgid "Triaging"
|
||||||
msgstr "Priorisierung"
|
msgstr "Priorisierung"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:88
|
|
||||||
msgid "Unable to add checklist item"
|
|
||||||
msgstr "Checklistenelement kann nicht hinzugefügt werden"
|
|
||||||
|
|
||||||
#: src/views/card/components/NewCommentForm.tsx:30
|
#: src/views/card/components/NewCommentForm.tsx:30
|
||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Kommentar konnte nicht hinzugefügt werden"
|
msgstr "Kommentar konnte nicht hinzugefügt werden"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:171
|
#: src/views/board/components/NewCardForm.tsx:142
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Karte konnte nicht erstellt werden"
|
msgstr "Karte konnte nicht erstellt werden"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:69
|
|
||||||
msgid "Unable to create checklist"
|
|
||||||
msgstr "Checkliste kann nicht erstellt werden"
|
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:77
|
#: src/views/board/components/NewListForm.tsx:77
|
||||||
msgid "Unable to create list"
|
msgid "Unable to create list"
|
||||||
msgstr "Liste konnte nicht erstellt werden"
|
msgstr "Liste konnte nicht erstellt werden"
|
||||||
@@ -1548,14 +1431,6 @@ msgstr "Workspace konnte nicht erstellt werden"
|
|||||||
msgid "Unable to delete card"
|
msgid "Unable to delete card"
|
||||||
msgstr "Karte konnte nicht gelöscht werden"
|
msgstr "Karte konnte nicht gelöscht werden"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
|
|
||||||
msgid "Unable to delete checklist"
|
|
||||||
msgstr "Checkliste kann nicht gelöscht werden"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:87
|
|
||||||
msgid "Unable to delete checklist item"
|
|
||||||
msgstr "Checklistenelement kann nicht gelöscht werden"
|
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
|
||||||
msgid "Unable to delete comment"
|
msgid "Unable to delete comment"
|
||||||
msgstr "Kommentar konnte nicht gelöscht werden"
|
msgstr "Kommentar konnte nicht gelöscht werden"
|
||||||
@@ -1576,20 +1451,12 @@ msgstr "Board-URL kann nicht aktualisiert werden"
|
|||||||
msgid "Unable to update board visibility"
|
msgid "Unable to update board visibility"
|
||||||
msgstr "Board-Sichtbarkeit konnte nicht aktualisiert werden"
|
msgstr "Board-Sichtbarkeit konnte nicht aktualisiert werden"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:172
|
#: src/views/card/index.tsx:158
|
||||||
#: src/views/board/index.tsx:189
|
#: src/views/board/index.tsx:190
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Karte konnte nicht aktualisiert werden"
|
msgstr "Karte konnte nicht aktualisiert werden"
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistNameInput.tsx:45
|
#: src/views/card/components/Comment.tsx:61
|
||||||
msgid "Unable to update checklist"
|
|
||||||
msgstr "Checkliste kann nicht aktualisiert werden"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:59
|
|
||||||
msgid "Unable to update checklist item"
|
|
||||||
msgstr "Checklistenelement kann nicht aktualisiert werden"
|
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:63
|
|
||||||
msgid "Unable to update comment"
|
msgid "Unable to update comment"
|
||||||
msgstr "Kommentar konnte nicht aktualisiert werden"
|
msgstr "Kommentar konnte nicht aktualisiert werden"
|
||||||
|
|
||||||
@@ -1598,7 +1465,7 @@ msgid "Unable to update labels"
|
|||||||
msgstr "Labels konnten nicht aktualisiert werden"
|
msgstr "Labels konnten nicht aktualisiert werden"
|
||||||
|
|
||||||
#: src/views/card/components/ListSelector.tsx:52
|
#: src/views/card/components/ListSelector.tsx:52
|
||||||
#: src/views/board/index.tsx:133
|
#: src/views/board/index.tsx:134
|
||||||
msgid "Unable to update list"
|
msgid "Unable to update list"
|
||||||
msgstr "Liste konnte nicht aktualisiert werden"
|
msgstr "Liste konnte nicht aktualisiert werden"
|
||||||
|
|
||||||
@@ -1606,12 +1473,11 @@ msgstr "Liste konnte nicht aktualisiert werden"
|
|||||||
msgid "Unable to update members"
|
msgid "Unable to update members"
|
||||||
msgstr "Mitglieder konnten nicht aktualisiert werden"
|
msgstr "Mitglieder konnten nicht aktualisiert werden"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(memberName)
|
#: src/views/card/components/ActivityList.tsx:102
|
||||||
#: src/views/card/components/ActivityList.tsx:121
|
msgid "unassigned <0>{memberName}</0> from the card"
|
||||||
msgid "unassigned <0>{0}</0> from the card"
|
msgstr "<0>{memberName}</0> von der Karte entfernt"
|
||||||
msgstr "hat <0>{0}</0> von der Karte entfernt"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:118
|
#: src/views/card/components/ActivityList.tsx:99
|
||||||
msgid "unassigned themselves from the card"
|
msgid "unassigned themselves from the card"
|
||||||
msgstr "hat sich selbst von der Karte entfernt"
|
msgstr "hat sich selbst von der Karte entfernt"
|
||||||
|
|
||||||
@@ -1647,26 +1513,21 @@ msgstr "Unbegrenzte listen"
|
|||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Aktualisieren"
|
msgstr "Aktualisieren"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:238
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Update label"
|
msgid "Update label"
|
||||||
msgstr "Label aktualisieren"
|
msgstr "Label aktualisieren"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:73
|
#: src/views/card/components/ActivityList.tsx:54
|
||||||
msgid "updated a checklist item"
|
|
||||||
msgstr "hat ein Checklistenelement aktualisiert"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:63
|
|
||||||
msgid "updated the description"
|
msgid "updated the description"
|
||||||
msgstr "hat die Beschreibung aktualisiert"
|
msgstr "hat die Beschreibung aktualisiert"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:62
|
#: src/views/card/components/ActivityList.tsx:53
|
||||||
msgid "updated the title"
|
msgid "updated the title"
|
||||||
msgstr "hat den Titel aktualisiert"
|
msgstr "hat den Titel aktualisiert"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
#: src/views/card/components/ActivityList.tsx:73
|
||||||
#: src/views/card/components/ActivityList.tsx:90
|
msgid "updated the title to <0>{toTitle}</0>"
|
||||||
msgid "updated the title to <0>{0}</0>"
|
msgstr "hat den Titel zu <0>{toTitle}</0> aktualisiert"
|
||||||
msgstr "hat den Titel in <0>{0}</0> geändert"
|
|
||||||
|
|
||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
||||||
msgid "Upgrade"
|
msgid "Upgrade"
|
||||||
@@ -1717,15 +1578,11 @@ msgstr "Verwalte deine Abrechnung und dein Abonnement."
|
|||||||
msgid "View docs"
|
msgid "View docs"
|
||||||
msgstr "Dokumentation ansehen"
|
msgstr "Dokumentation ansehen"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:120
|
|
||||||
msgid "View only"
|
|
||||||
msgstr "Nur ansehen"
|
|
||||||
|
|
||||||
#: src/views/home/components/Features.tsx:147
|
#: src/views/home/components/Features.tsx:147
|
||||||
msgid "View our roadmap."
|
msgid "View our roadmap."
|
||||||
msgstr "Sieh dir unsere roadmap an."
|
msgstr "Sieh dir unsere roadmap an."
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:149
|
#: src/views/public/board/index.tsx:143
|
||||||
msgid "View workspace"
|
msgid "View workspace"
|
||||||
msgstr "Workspace anzeigen"
|
msgstr "Workspace anzeigen"
|
||||||
|
|
||||||
@@ -1761,7 +1618,7 @@ msgstr "Als Trello 2011 auf den markt kam, beeindruckte es alle mit seiner sorgf
|
|||||||
msgid "Why make an open source Trello?"
|
msgid "Why make an open source Trello?"
|
||||||
msgstr "Warum ein open source Trello entwickeln?"
|
msgstr "Warum ein open source Trello entwickeln?"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:331
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Workspace"
|
msgid "Workspace"
|
||||||
msgstr "Arbeitsbereich"
|
msgstr "Arbeitsbereich"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Plural-Forms: \n"
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:123
|
#: src/views/card/components/Comment.tsx:121
|
||||||
msgid " (edited)"
|
msgid " (edited)"
|
||||||
msgstr " (edited)"
|
msgstr " (edited)"
|
||||||
|
|
||||||
@@ -23,12 +23,12 @@ msgstr ", or see our"
|
|||||||
|
|
||||||
#. placeholder {0}: card?.title ?? "Card"
|
#. placeholder {0}: card?.title ?? "Card"
|
||||||
#. placeholder {1}: board?.name ?? "Board"
|
#. placeholder {1}: board?.name ?? "Board"
|
||||||
#: src/views/card/index.tsx:214
|
#: src/views/card/index.tsx:189
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
#. placeholder {0}: labelPublicIds.length
|
#. placeholder {0}: labelPublicIds.length
|
||||||
#: src/views/board/components/NewCardForm.tsx:432
|
#: src/views/board/components/NewCardForm.tsx:392
|
||||||
msgid "{0} labels"
|
msgid "{0} labels"
|
||||||
msgstr "{0} labels"
|
msgstr "{0} labels"
|
||||||
|
|
||||||
@@ -60,8 +60,8 @@ msgstr "A powerful, flexible kanban app that helps you organise work, track prog
|
|||||||
msgid "Account deleted"
|
msgid "Account deleted"
|
||||||
msgstr "Account deleted"
|
msgstr "Account deleted"
|
||||||
|
|
||||||
#: src/views/public/board/CardModal.tsx:140
|
#: src/views/public/board/CardModal.tsx:104
|
||||||
#: src/views/card/index.tsx:288
|
#: src/views/card/index.tsx:256
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Activity"
|
msgstr "Activity"
|
||||||
|
|
||||||
@@ -74,29 +74,13 @@ msgid "Add a card"
|
|||||||
msgstr "Add a card"
|
msgstr "Add a card"
|
||||||
|
|
||||||
#: src/views/card/components/NewCommentForm.tsx:57
|
#: src/views/card/components/NewCommentForm.tsx:57
|
||||||
#: src/views/card/components/Comment.tsx:146
|
#: src/views/card/components/Comment.tsx:144
|
||||||
msgid "Add a comment..."
|
msgid "Add a comment..."
|
||||||
msgstr "Add a comment..."
|
msgstr "Add a comment..."
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:140
|
#: src/components/Editor.tsx:303
|
||||||
msgid "Add an item..."
|
msgid "Add description... (type '/' to open commands)"
|
||||||
msgstr "Add an item..."
|
msgstr "Add description... (type '/' to open commands)"
|
||||||
|
|
||||||
#: src/views/card/components/Dropdown.tsx:18
|
|
||||||
msgid "Add checklist"
|
|
||||||
msgstr "Add checklist"
|
|
||||||
|
|
||||||
#: src/components/Editor.tsx:442
|
|
||||||
msgid "Add description... (type '/' to open commands or '@' to mention)"
|
|
||||||
msgstr "Add description... (type '/' to open commands or '@' to mention)"
|
|
||||||
|
|
||||||
#: src/components/Editor.tsx:308
|
|
||||||
#~ msgid "Add description... (type '/' to open commands)"
|
|
||||||
#~ msgstr "Add description... (type '/' to open commands)"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:172
|
|
||||||
msgid "Add details..."
|
|
||||||
msgstr "Add details..."
|
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:110
|
#: src/views/card/components/LabelSelector.tsx:110
|
||||||
#: src/views/card/components/LabelSelector.tsx:118
|
#: src/views/card/components/LabelSelector.tsx:118
|
||||||
@@ -108,40 +92,17 @@ msgstr "Add label"
|
|||||||
msgid "Add member"
|
msgid "Add member"
|
||||||
msgstr "Add member"
|
msgstr "Add member"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:69
|
#: src/views/card/components/ActivityList.tsx:56
|
||||||
msgid "added a checklist"
|
|
||||||
msgstr "added a checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:72
|
|
||||||
msgid "added a checklist item"
|
|
||||||
msgstr "added a checklist item"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:65
|
|
||||||
msgid "added a label to the card"
|
msgid "added a label to the card"
|
||||||
msgstr "added a label to the card"
|
msgstr "added a label to the card"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:67
|
#: src/views/card/components/ActivityList.tsx:58
|
||||||
msgid "added a member to the card"
|
msgid "added a member to the card"
|
||||||
msgstr "added a member to the card"
|
msgstr "added a member to the card"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:146
|
|
||||||
msgid "added checklist <0>{0}</0>"
|
|
||||||
msgstr "added checklist <0>{0}</0>"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:170
|
|
||||||
msgid "added checklist item <0>{0}</0>"
|
|
||||||
msgstr "added checklist item <0>{0}</0>"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(label)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:130
|
|
||||||
msgid "added label <0>{0}</0>"
|
|
||||||
msgstr "added label <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:110
|
#: src/views/card/components/ActivityList.tsx:110
|
||||||
#~ msgid "added label <0>{label}</0>"
|
msgid "added label <0>{label}</0>"
|
||||||
#~ msgstr "added label <0>{label}</0>"
|
msgstr "added label <0>{label}</0>"
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:55
|
#: src/views/home/components/Pricing.tsx:55
|
||||||
msgid "Admin roles"
|
msgid "Admin roles"
|
||||||
@@ -196,15 +157,11 @@ msgstr "Are you sure you want to delete the workspace {0}?"
|
|||||||
msgid "Are you sure you want to delete this card?"
|
msgid "Are you sure you want to delete this card?"
|
||||||
msgstr "Are you sure you want to delete this card?"
|
msgstr "Are you sure you want to delete this card?"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
|
|
||||||
msgid "Are you sure you want to delete this checklist?"
|
|
||||||
msgstr "Are you sure you want to delete this checklist?"
|
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
|
||||||
msgid "Are you sure you want to delete this comment?"
|
msgid "Are you sure you want to delete this comment?"
|
||||||
msgstr "Are you sure you want to delete this comment?"
|
msgstr "Are you sure you want to delete this comment?"
|
||||||
|
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:41
|
#: src/components/DeleteLabelConfirmation.tsx:39
|
||||||
msgid "Are you sure you want to delete this label?"
|
msgid "Are you sure you want to delete this label?"
|
||||||
msgstr "Are you sure you want to delete this label?"
|
msgstr "Are you sure you want to delete this label?"
|
||||||
|
|
||||||
@@ -212,14 +169,9 @@ msgstr "Are you sure you want to delete this label?"
|
|||||||
msgid "Are you sure you want to delete your account?"
|
msgid "Are you sure you want to delete your account?"
|
||||||
msgstr "Are you sure you want to delete your account?"
|
msgstr "Are you sure you want to delete your account?"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(memberName)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:110
|
|
||||||
msgid "assigned <0>{0}</0> to the card"
|
|
||||||
msgstr "assigned <0>{0}</0> to the card"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:92
|
#: src/views/card/components/ActivityList.tsx:92
|
||||||
#~ msgid "assigned <0>{memberName}</0> to the card"
|
msgid "assigned <0>{memberName}</0> to the card"
|
||||||
#~ msgstr "assigned <0>{memberName}</0> to the card"
|
msgstr "assigned <0>{memberName}</0> to the card"
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:46
|
#: src/views/boards/components/TemplateBoards.tsx:46
|
||||||
msgid "Awaiting Customer"
|
msgid "Awaiting Customer"
|
||||||
@@ -250,7 +202,7 @@ msgstr "Billing portal"
|
|||||||
msgid "Blog Post"
|
msgid "Blog Post"
|
||||||
msgstr "Blog Post"
|
msgstr "Blog Post"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:331
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Board"
|
msgstr "Board"
|
||||||
|
|
||||||
@@ -266,8 +218,8 @@ msgstr "Board name cannot exceed 100 characters"
|
|||||||
msgid "Board name is required"
|
msgid "Board name is required"
|
||||||
msgstr "Board name is required"
|
msgstr "Board name is required"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:143
|
#: src/views/public/board/index.tsx:137
|
||||||
#: src/views/board/index.tsx:357
|
#: src/views/board/index.tsx:358
|
||||||
msgid "Board not found"
|
msgid "Board not found"
|
||||||
msgstr "Board not found"
|
msgstr "Board not found"
|
||||||
|
|
||||||
@@ -326,18 +278,17 @@ msgstr "Bug Report"
|
|||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
||||||
#: src/views/card/components/Comment.tsx:158
|
#: src/views/card/components/Comment.tsx:156
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:49
|
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancel"
|
msgstr "Cancel"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:259
|
#: src/views/card/index.tsx:234
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Card not found"
|
msgstr "Card not found"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:307
|
#: src/views/board/components/NewCardForm.tsx:278
|
||||||
msgid "Card title"
|
msgid "Card title"
|
||||||
msgstr "Card title"
|
msgstr "Card title"
|
||||||
|
|
||||||
@@ -350,10 +301,6 @@ msgstr "Change the language of the app."
|
|||||||
msgid "Check your inbox"
|
msgid "Check your inbox"
|
||||||
msgstr "Check your inbox"
|
msgstr "Check your inbox"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:118
|
|
||||||
msgid "Checklist name"
|
|
||||||
msgstr "Checklist name"
|
|
||||||
|
|
||||||
#: src/views/board/components/Filters.tsx:155
|
#: src/views/board/components/Filters.tsx:155
|
||||||
msgid "Clear filters"
|
msgid "Clear filters"
|
||||||
msgstr "Clear filters"
|
msgstr "Clear filters"
|
||||||
@@ -391,15 +338,6 @@ msgstr "Complete"
|
|||||||
msgid "Complete control and ownership:"
|
msgid "Complete control and ownership:"
|
||||||
msgstr "Complete control and ownership:"
|
msgstr "Complete control and ownership:"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:74
|
|
||||||
msgid "completed a checklist item"
|
|
||||||
msgstr "completed a checklist item"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:187
|
|
||||||
msgid "completed checklist item <0>{0}</0>"
|
|
||||||
msgstr "completed checklist item <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:42
|
#: src/views/settings/components/CustomURLConfirmation.tsx:42
|
||||||
msgid "Confirm URL change"
|
msgid "Confirm URL change"
|
||||||
msgstr "Confirm URL change"
|
msgstr "Confirm URL change"
|
||||||
@@ -443,8 +381,8 @@ msgid "Control who can view and edit your boards."
|
|||||||
msgstr "Control who can view and edit your boards."
|
msgstr "Control who can view and edit your boards."
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:140
|
#: src/views/board/components/NewListForm.tsx:140
|
||||||
#: src/views/board/components/NewCardForm.tsx:458
|
#: src/views/board/components/NewCardForm.tsx:418
|
||||||
#: src/components/LabelForm.tsx:213
|
#: src/components/LabelForm.tsx:212
|
||||||
msgid "Create another"
|
msgid "Create another"
|
||||||
msgstr "Create another"
|
msgstr "Create another"
|
||||||
|
|
||||||
@@ -460,15 +398,11 @@ msgstr "Create another"
|
|||||||
msgid "Create board"
|
msgid "Create board"
|
||||||
msgstr "Create board"
|
msgstr "Create board"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:468
|
#: src/views/board/components/NewCardForm.tsx:428
|
||||||
msgid "Create card"
|
msgid "Create card"
|
||||||
msgstr "Create card"
|
msgstr "Create card"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:134
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Create checklist"
|
|
||||||
msgstr "Create checklist"
|
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:238
|
|
||||||
msgid "Create label"
|
msgid "Create label"
|
||||||
msgstr "Create label"
|
msgstr "Create label"
|
||||||
|
|
||||||
@@ -485,11 +419,11 @@ msgid "Create new key"
|
|||||||
msgstr "Create new key"
|
msgstr "Create new key"
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:98
|
#: src/views/card/components/LabelSelector.tsx:98
|
||||||
#: src/views/board/components/NewCardForm.tsx:394
|
#: src/views/board/components/NewCardForm.tsx:354
|
||||||
msgid "Create new label"
|
msgid "Create new label"
|
||||||
msgstr "Create new label"
|
msgstr "Create new label"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:425
|
#: src/views/board/index.tsx:426
|
||||||
msgid "Create new list"
|
msgid "Create new list"
|
||||||
msgstr "Create new list"
|
msgstr "Create new list"
|
||||||
|
|
||||||
@@ -498,7 +432,7 @@ msgstr "Create new list"
|
|||||||
msgid "Create workspace"
|
msgid "Create workspace"
|
||||||
msgstr "Create workspace"
|
msgstr "Create workspace"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:61
|
#: src/views/card/components/ActivityList.tsx:52
|
||||||
msgid "created the card"
|
msgid "created the card"
|
||||||
msgstr "created the card"
|
msgstr "created the card"
|
||||||
|
|
||||||
@@ -523,10 +457,9 @@ msgid "Dark"
|
|||||||
msgstr "Dark"
|
msgstr "Dark"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||||
#: src/components/LabelForm.tsx:228
|
#: src/components/LabelForm.tsx:226
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:51
|
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Delete"
|
msgstr "Delete"
|
||||||
|
|
||||||
@@ -540,11 +473,11 @@ msgstr "Delete account"
|
|||||||
msgid "Delete board"
|
msgid "Delete board"
|
||||||
msgstr "Delete board"
|
msgstr "Delete board"
|
||||||
|
|
||||||
#: src/views/card/components/Dropdown.tsx:25
|
#: src/views/card/components/Dropdown.tsx:14
|
||||||
msgid "Delete card"
|
msgid "Delete card"
|
||||||
msgstr "Delete card"
|
msgstr "Delete card"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:91
|
#: src/views/card/components/Comment.tsx:89
|
||||||
msgid "Delete comment"
|
msgid "Delete comment"
|
||||||
msgstr "Delete comment"
|
msgstr "Delete comment"
|
||||||
|
|
||||||
@@ -558,24 +491,6 @@ msgstr "Delete list"
|
|||||||
msgid "Delete workspace"
|
msgid "Delete workspace"
|
||||||
msgstr "Delete workspace"
|
msgstr "Delete workspace"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:71
|
|
||||||
msgid "deleted a checklist"
|
|
||||||
msgstr "deleted a checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:76
|
|
||||||
msgid "deleted a checklist item"
|
|
||||||
msgstr "deleted a checklist item"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:162
|
|
||||||
msgid "deleted checklist <0>{0}</0>"
|
|
||||||
msgstr "deleted checklist <0>{0}</0>"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:205
|
|
||||||
msgid "deleted checklist item <0>{0}</0>"
|
|
||||||
msgstr "deleted checklist item <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:32
|
#: src/views/boards/components/TemplateBoards.tsx:32
|
||||||
msgid "Design"
|
msgid "Design"
|
||||||
msgstr "Design"
|
msgstr "Design"
|
||||||
@@ -638,11 +553,11 @@ msgstr "Done"
|
|||||||
msgid "Edit board URL"
|
msgid "Edit board URL"
|
||||||
msgstr "Edit board URL"
|
msgstr "Edit board URL"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:82
|
#: src/views/card/components/Comment.tsx:80
|
||||||
msgid "Edit comment"
|
msgid "Edit comment"
|
||||||
msgstr "Edit comment"
|
msgstr "Edit comment"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:119
|
#: src/components/LabelForm.tsx:118
|
||||||
msgid "Edit label"
|
msgid "Edit label"
|
||||||
msgstr "Edit label"
|
msgstr "Edit label"
|
||||||
|
|
||||||
@@ -682,7 +597,7 @@ msgstr "Enter your password"
|
|||||||
msgid "Error deleting account"
|
msgid "Error deleting account"
|
||||||
msgstr "Error deleting account"
|
msgstr "Error deleting account"
|
||||||
|
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:25
|
#: src/components/DeleteLabelConfirmation.tsx:22
|
||||||
msgid "Error deleting label"
|
msgid "Error deleting label"
|
||||||
msgstr "Error deleting label"
|
msgstr "Error deleting label"
|
||||||
|
|
||||||
@@ -814,7 +729,7 @@ msgstr "Get Started"
|
|||||||
msgid "Get started by creating a new board"
|
msgid "Get started by creating a new board"
|
||||||
msgstr "Get started by creating a new board"
|
msgstr "Get started by creating a new board"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:417
|
#: src/views/board/index.tsx:418
|
||||||
msgid "Get started by creating a new list"
|
msgid "Get started by creating a new list"
|
||||||
msgstr "Get started by creating a new list"
|
msgstr "Get started by creating a new list"
|
||||||
|
|
||||||
@@ -975,8 +890,8 @@ msgstr "Kanban reimagined"
|
|||||||
msgid "Keep in mind that this action is irreversible."
|
msgid "Keep in mind that this action is irreversible."
|
||||||
msgstr "Keep in mind that this action is irreversible."
|
msgstr "Keep in mind that this action is irreversible."
|
||||||
|
|
||||||
#: src/views/card/index.tsx:118
|
#: src/views/card/index.tsx:113
|
||||||
#: src/views/board/components/NewCardForm.tsx:398
|
#: src/views/board/components/NewCardForm.tsx:358
|
||||||
#: src/views/board/components/Filters.tsx:101
|
#: src/views/board/components/Filters.tsx:101
|
||||||
msgid "Labels"
|
msgid "Labels"
|
||||||
msgstr "Labels"
|
msgstr "Labels"
|
||||||
@@ -1009,7 +924,7 @@ msgstr "Light"
|
|||||||
msgid "Link copied"
|
msgid "Link copied"
|
||||||
msgstr "Link copied"
|
msgstr "Link copied"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:110
|
#: src/views/card/index.tsx:105
|
||||||
msgid "List"
|
msgid "List"
|
||||||
msgstr "List"
|
msgstr "List"
|
||||||
|
|
||||||
@@ -1037,22 +952,13 @@ msgstr "Low Priority"
|
|||||||
msgid "magic link"
|
msgid "magic link"
|
||||||
msgstr "magic link"
|
msgstr "magic link"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:75
|
|
||||||
msgid "marked a checklist item as incomplete"
|
|
||||||
msgstr "marked a checklist item as incomplete"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:196
|
|
||||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
|
||||||
msgstr "marked checklist item <0>{0}</0> as incomplete"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:17
|
#: src/views/boards/components/TemplateBoards.tsx:17
|
||||||
msgid "Medium Priority"
|
msgid "Medium Priority"
|
||||||
msgstr "Medium Priority"
|
msgstr "Medium Priority"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:161
|
#: src/views/members/index.tsx:161
|
||||||
#: src/views/card/index.tsx:126
|
#: src/views/card/index.tsx:121
|
||||||
#: src/views/board/components/NewCardForm.tsx:357
|
#: src/views/board/components/NewCardForm.tsx:317
|
||||||
#: src/views/board/components/Filters.tsx:93
|
#: src/views/board/components/Filters.tsx:93
|
||||||
#: src/components/SideNavigation.tsx:73
|
#: src/components/SideNavigation.tsx:73
|
||||||
msgid "Members"
|
msgid "Members"
|
||||||
@@ -1067,22 +973,16 @@ msgstr "Members | {0}"
|
|||||||
msgid "Monthly"
|
msgid "Monthly"
|
||||||
msgstr "Monthly"
|
msgstr "Monthly"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromList)
|
|
||||||
#. placeholder {1}: truncate(toList)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:98
|
|
||||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
|
||||||
msgstr "moved the card from <0>{0}</0> to<1>{1}</1>"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:81
|
#: src/views/card/components/ActivityList.tsx:81
|
||||||
#~ msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||||
#~ msgstr "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
msgstr "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:64
|
#: src/views/card/components/ActivityList.tsx:55
|
||||||
msgid "moved the card to another list"
|
msgid "moved the card to another list"
|
||||||
msgstr "moved the card to another list"
|
msgstr "moved the card to another list"
|
||||||
|
|
||||||
#: src/views/boards/components/NewBoardForm.tsx:99
|
#: src/views/boards/components/NewBoardForm.tsx:99
|
||||||
#: src/components/LabelForm.tsx:135
|
#: src/components/LabelForm.tsx:134
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
@@ -1098,23 +998,19 @@ msgstr "New"
|
|||||||
msgid "New board"
|
msgid "New board"
|
||||||
msgstr "New board"
|
msgstr "New board"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:290
|
#: src/views/board/components/NewCardForm.tsx:261
|
||||||
msgid "New card"
|
msgid "New card"
|
||||||
msgstr "New card"
|
msgstr "New card"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:102
|
|
||||||
msgid "New checklist"
|
|
||||||
msgstr "New checklist"
|
|
||||||
|
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
||||||
msgid "New import"
|
msgid "New import"
|
||||||
msgstr "New import"
|
msgstr "New import"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:119
|
#: src/components/LabelForm.tsx:118
|
||||||
msgid "New label"
|
msgid "New label"
|
||||||
msgstr "New label"
|
msgstr "New label"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:394
|
#: src/views/board/index.tsx:395
|
||||||
#: src/views/board/components/NewListForm.tsx:112
|
#: src/views/board/components/NewListForm.tsx:112
|
||||||
msgid "New list"
|
msgid "New list"
|
||||||
msgstr "New list"
|
msgstr "New list"
|
||||||
@@ -1151,7 +1047,7 @@ msgstr "No boards found"
|
|||||||
msgid "No credit card required"
|
msgid "No credit card required"
|
||||||
msgstr "No credit card required"
|
msgstr "No credit card required"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:414
|
#: src/views/board/index.tsx:415
|
||||||
msgid "No lists"
|
msgid "No lists"
|
||||||
msgstr "No lists"
|
msgstr "No lists"
|
||||||
|
|
||||||
@@ -1234,30 +1130,24 @@ msgstr "Please select a file to upload."
|
|||||||
#: src/views/settings/components/Avatar.tsx:98
|
#: src/views/settings/components/Avatar.tsx:98
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/card/index.tsx:173
|
#: src/views/card/index.tsx:159
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
|
||||||
#: src/views/card/components/MemberSelector.tsx:80
|
#: src/views/card/components/MemberSelector.tsx:80
|
||||||
#: src/views/card/components/ListSelector.tsx:53
|
#: src/views/card/components/ListSelector.tsx:53
|
||||||
#: src/views/card/components/LabelSelector.tsx:73
|
#: src/views/card/components/LabelSelector.tsx:73
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
||||||
#: src/views/card/components/Comment.tsx:64
|
#: src/views/card/components/Comment.tsx:62
|
||||||
#: src/views/card/components/ChecklistNameInput.tsx:46
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:60
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:88
|
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
||||||
#: src/views/board/index.tsx:134
|
#: src/views/board/index.tsx:135
|
||||||
#: src/views/board/index.tsx:190
|
#: src/views/board/index.tsx:191
|
||||||
#: src/views/board/components/VisibilityButton.tsx:53
|
#: src/views/board/components/VisibilityButton.tsx:53
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||||
#: src/views/board/components/NewListForm.tsx:78
|
#: src/views/board/components/NewListForm.tsx:78
|
||||||
#: src/views/board/components/NewCardForm.tsx:174
|
#: src/views/board/components/NewCardForm.tsx:145
|
||||||
#: src/components/NewWorkspaceForm.tsx:41
|
#: src/components/NewWorkspaceForm.tsx:41
|
||||||
#: src/components/FeedbackModal.tsx:41
|
#: src/components/FeedbackModal.tsx:41
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
#: src/components/DeleteLabelConfirmation.tsx:23
|
||||||
msgid "Please try again later, or contact customer support."
|
msgid "Please try again later, or contact customer support."
|
||||||
msgstr "Please try again later, or contact customer support."
|
msgstr "Please try again later, or contact customer support."
|
||||||
|
|
||||||
@@ -1323,36 +1213,17 @@ msgstr "Remove"
|
|||||||
msgid "Remove member"
|
msgid "Remove member"
|
||||||
msgstr "Remove member"
|
msgstr "Remove member"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:66
|
#: src/views/card/components/ActivityList.tsx:57
|
||||||
msgid "removed a label from the card"
|
msgid "removed a label from the card"
|
||||||
msgstr "removed a label from the card"
|
msgstr "removed a label from the card"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:68
|
#: src/views/card/components/ActivityList.tsx:59
|
||||||
msgid "removed a member from the card"
|
msgid "removed a member from the card"
|
||||||
msgstr "removed a member from the card"
|
msgstr "removed a member from the card"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(label)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:138
|
|
||||||
msgid "removed label <0>{0}</0>"
|
|
||||||
msgstr "removed label <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:118
|
#: src/views/card/components/ActivityList.tsx:118
|
||||||
#~ msgid "removed label <0>{label}</0>"
|
msgid "removed label <0>{label}</0>"
|
||||||
#~ msgstr "removed label <0>{label}</0>"
|
msgstr "removed label <0>{label}</0>"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:70
|
|
||||||
msgid "renamed a checklist"
|
|
||||||
msgstr "renamed a checklist"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:154
|
|
||||||
msgid "renamed checklist <0>{0}</0>"
|
|
||||||
msgstr "renamed checklist <0>{0}</0>"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:178
|
|
||||||
msgid "renamed checklist item to <0>{0}</0>"
|
|
||||||
msgstr "renamed checklist item to <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:76
|
#: src/views/boards/components/TemplateBoards.tsx:76
|
||||||
msgid "Research"
|
msgid "Research"
|
||||||
@@ -1387,7 +1258,7 @@ msgstr "Role"
|
|||||||
msgid "Run on your own infrastructure"
|
msgid "Run on your own infrastructure"
|
||||||
msgstr "Run on your own infrastructure"
|
msgstr "Run on your own infrastructure"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:165
|
#: src/views/card/components/Comment.tsx:163
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Save"
|
msgstr "Save"
|
||||||
|
|
||||||
@@ -1415,7 +1286,7 @@ msgstr "Self Host"
|
|||||||
msgid "Self host with Github"
|
msgid "Self host with Github"
|
||||||
msgstr "Self host with Github"
|
msgstr "Self host with Github"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:107
|
#: src/views/card/components/ActivityList.tsx:89
|
||||||
msgid "self-assigned the card"
|
msgid "self-assigned the card"
|
||||||
msgstr "self-assigned the card"
|
msgstr "self-assigned the card"
|
||||||
|
|
||||||
@@ -1538,13 +1409,12 @@ msgid "They won't be able to access this workspace."
|
|||||||
msgstr "They won't be able to access this workspace."
|
msgstr "They won't be able to access this workspace."
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:44
|
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||||
msgid "This action can't be undone."
|
msgid "This action can't be undone."
|
||||||
msgstr "This action can't be undone."
|
msgstr "This action can't be undone."
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:146
|
#: src/views/public/board/index.tsx:140
|
||||||
msgid "This board is private or does not exist"
|
msgid "This board is private or does not exist"
|
||||||
msgstr "This board is private or does not exist"
|
msgstr "This board is private or does not exist"
|
||||||
|
|
||||||
@@ -1593,22 +1463,14 @@ msgstr "Trello imports"
|
|||||||
msgid "Triaging"
|
msgid "Triaging"
|
||||||
msgstr "Triaging"
|
msgstr "Triaging"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:88
|
|
||||||
msgid "Unable to add checklist item"
|
|
||||||
msgstr "Unable to add checklist item"
|
|
||||||
|
|
||||||
#: src/views/card/components/NewCommentForm.tsx:30
|
#: src/views/card/components/NewCommentForm.tsx:30
|
||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Unable to add comment"
|
msgstr "Unable to add comment"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:171
|
#: src/views/board/components/NewCardForm.tsx:142
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Unable to create card"
|
msgstr "Unable to create card"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:69
|
|
||||||
msgid "Unable to create checklist"
|
|
||||||
msgstr "Unable to create checklist"
|
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:77
|
#: src/views/board/components/NewListForm.tsx:77
|
||||||
msgid "Unable to create list"
|
msgid "Unable to create list"
|
||||||
msgstr "Unable to create list"
|
msgstr "Unable to create list"
|
||||||
@@ -1621,14 +1483,6 @@ msgstr "Unable to create workspace"
|
|||||||
msgid "Unable to delete card"
|
msgid "Unable to delete card"
|
||||||
msgstr "Unable to delete card"
|
msgstr "Unable to delete card"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
|
|
||||||
msgid "Unable to delete checklist"
|
|
||||||
msgstr "Unable to delete checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:87
|
|
||||||
msgid "Unable to delete checklist item"
|
|
||||||
msgstr "Unable to delete checklist item"
|
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
|
||||||
msgid "Unable to delete comment"
|
msgid "Unable to delete comment"
|
||||||
msgstr "Unable to delete comment"
|
msgstr "Unable to delete comment"
|
||||||
@@ -1649,20 +1503,12 @@ msgstr "Unable to update board URL"
|
|||||||
msgid "Unable to update board visibility"
|
msgid "Unable to update board visibility"
|
||||||
msgstr "Unable to update board visibility"
|
msgstr "Unable to update board visibility"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:172
|
#: src/views/card/index.tsx:158
|
||||||
#: src/views/board/index.tsx:189
|
#: src/views/board/index.tsx:190
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Unable to update card"
|
msgstr "Unable to update card"
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistNameInput.tsx:45
|
#: src/views/card/components/Comment.tsx:61
|
||||||
msgid "Unable to update checklist"
|
|
||||||
msgstr "Unable to update checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:59
|
|
||||||
msgid "Unable to update checklist item"
|
|
||||||
msgstr "Unable to update checklist item"
|
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:63
|
|
||||||
msgid "Unable to update comment"
|
msgid "Unable to update comment"
|
||||||
msgstr "Unable to update comment"
|
msgstr "Unable to update comment"
|
||||||
|
|
||||||
@@ -1671,7 +1517,7 @@ msgid "Unable to update labels"
|
|||||||
msgstr "Unable to update labels"
|
msgstr "Unable to update labels"
|
||||||
|
|
||||||
#: src/views/card/components/ListSelector.tsx:52
|
#: src/views/card/components/ListSelector.tsx:52
|
||||||
#: src/views/board/index.tsx:133
|
#: src/views/board/index.tsx:134
|
||||||
msgid "Unable to update list"
|
msgid "Unable to update list"
|
||||||
msgstr "Unable to update list"
|
msgstr "Unable to update list"
|
||||||
|
|
||||||
@@ -1679,16 +1525,11 @@ msgstr "Unable to update list"
|
|||||||
msgid "Unable to update members"
|
msgid "Unable to update members"
|
||||||
msgstr "Unable to update members"
|
msgstr "Unable to update members"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(memberName)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:121
|
|
||||||
msgid "unassigned <0>{0}</0> from the card"
|
|
||||||
msgstr "unassigned <0>{0}</0> from the card"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:102
|
#: src/views/card/components/ActivityList.tsx:102
|
||||||
#~ msgid "unassigned <0>{memberName}</0> from the card"
|
msgid "unassigned <0>{memberName}</0> from the card"
|
||||||
#~ msgstr "unassigned <0>{memberName}</0> from the card"
|
msgstr "unassigned <0>{memberName}</0> from the card"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:118
|
#: src/views/card/components/ActivityList.tsx:99
|
||||||
msgid "unassigned themselves from the card"
|
msgid "unassigned themselves from the card"
|
||||||
msgstr "unassigned themselves from the card"
|
msgstr "unassigned themselves from the card"
|
||||||
|
|
||||||
@@ -1724,30 +1565,21 @@ msgstr "Unlimited lists"
|
|||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Update"
|
msgstr "Update"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:238
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Update label"
|
msgid "Update label"
|
||||||
msgstr "Update label"
|
msgstr "Update label"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:73
|
#: src/views/card/components/ActivityList.tsx:54
|
||||||
msgid "updated a checklist item"
|
|
||||||
msgstr "updated a checklist item"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:63
|
|
||||||
msgid "updated the description"
|
msgid "updated the description"
|
||||||
msgstr "updated the description"
|
msgstr "updated the description"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:62
|
#: src/views/card/components/ActivityList.tsx:53
|
||||||
msgid "updated the title"
|
msgid "updated the title"
|
||||||
msgstr "updated the title"
|
msgstr "updated the title"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:90
|
|
||||||
msgid "updated the title to <0>{0}</0>"
|
|
||||||
msgstr "updated the title to <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:73
|
#: src/views/card/components/ActivityList.tsx:73
|
||||||
#~ msgid "updated the title to <0>{toTitle}</0>"
|
msgid "updated the title to <0>{toTitle}</0>"
|
||||||
#~ msgstr "updated the title to <0>{toTitle}</0>"
|
msgstr "updated the title to <0>{toTitle}</0>"
|
||||||
|
|
||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
||||||
msgid "Upgrade"
|
msgid "Upgrade"
|
||||||
@@ -1798,15 +1630,11 @@ msgstr "View and manage your billing and subscription."
|
|||||||
msgid "View docs"
|
msgid "View docs"
|
||||||
msgstr "View docs"
|
msgstr "View docs"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:120
|
|
||||||
msgid "View only"
|
|
||||||
msgstr "View only"
|
|
||||||
|
|
||||||
#: src/views/home/components/Features.tsx:147
|
#: src/views/home/components/Features.tsx:147
|
||||||
msgid "View our roadmap."
|
msgid "View our roadmap."
|
||||||
msgstr "View our roadmap."
|
msgstr "View our roadmap."
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:149
|
#: src/views/public/board/index.tsx:143
|
||||||
msgid "View workspace"
|
msgid "View workspace"
|
||||||
msgstr "View workspace"
|
msgstr "View workspace"
|
||||||
|
|
||||||
@@ -1846,7 +1674,7 @@ msgstr "When Trello launched in 2011, it blew everyone away with its carefully d
|
|||||||
msgid "Why make an open source Trello?"
|
msgid "Why make an open source Trello?"
|
||||||
msgstr "Why make an open source Trello?"
|
msgstr "Why make an open source Trello?"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:331
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Workspace"
|
msgid "Workspace"
|
||||||
msgstr "Workspace"
|
msgstr "Workspace"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Plural-Forms: \n"
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:123
|
#: src/views/card/components/Comment.tsx:121
|
||||||
msgid " (edited)"
|
msgid " (edited)"
|
||||||
msgstr " (editado)"
|
msgstr " (editado)"
|
||||||
|
|
||||||
@@ -23,12 +23,12 @@ msgstr ", o consulta nuestra"
|
|||||||
|
|
||||||
#. placeholder {0}: card?.title ?? "Card"
|
#. placeholder {0}: card?.title ?? "Card"
|
||||||
#. placeholder {1}: board?.name ?? "Board"
|
#. placeholder {1}: board?.name ?? "Board"
|
||||||
#: src/views/card/index.tsx:214
|
#: src/views/card/index.tsx:189
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
#. placeholder {0}: labelPublicIds.length
|
#. placeholder {0}: labelPublicIds.length
|
||||||
#: src/views/board/components/NewCardForm.tsx:432
|
#: src/views/board/components/NewCardForm.tsx:392
|
||||||
msgid "{0} labels"
|
msgid "{0} labels"
|
||||||
msgstr "{0} etiquetas"
|
msgstr "{0} etiquetas"
|
||||||
|
|
||||||
@@ -48,8 +48,8 @@ msgstr "Una aplicación kanban potente y flexible que te ayuda a organizar el tr
|
|||||||
msgid "Account deleted"
|
msgid "Account deleted"
|
||||||
msgstr "Cuenta eliminada"
|
msgstr "Cuenta eliminada"
|
||||||
|
|
||||||
#: src/views/public/board/CardModal.tsx:140
|
#: src/views/public/board/CardModal.tsx:104
|
||||||
#: src/views/card/index.tsx:288
|
#: src/views/card/index.tsx:256
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Actividad"
|
msgstr "Actividad"
|
||||||
|
|
||||||
@@ -62,25 +62,13 @@ msgid "Add a card"
|
|||||||
msgstr "Añadir una tarjeta"
|
msgstr "Añadir una tarjeta"
|
||||||
|
|
||||||
#: src/views/card/components/NewCommentForm.tsx:57
|
#: src/views/card/components/NewCommentForm.tsx:57
|
||||||
#: src/views/card/components/Comment.tsx:146
|
#: src/views/card/components/Comment.tsx:144
|
||||||
msgid "Add a comment..."
|
msgid "Add a comment..."
|
||||||
msgstr "Añadir un comentario..."
|
msgstr "Añadir un comentario..."
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:140
|
#: src/components/Editor.tsx:303
|
||||||
msgid "Add an item..."
|
msgid "Add description... (type '/' to open commands)"
|
||||||
msgstr "Añadir un elemento..."
|
msgstr "Añadir descripción... (escribe '/' para abrir comandos)"
|
||||||
|
|
||||||
#: src/views/card/components/Dropdown.tsx:18
|
|
||||||
msgid "Add checklist"
|
|
||||||
msgstr "Añadir lista de verificación"
|
|
||||||
|
|
||||||
#: src/components/Editor.tsx:442
|
|
||||||
msgid "Add description... (type '/' to open commands or '@' to mention)"
|
|
||||||
msgstr "Añadir descripción... (escribe '/' para abrir comandos o '@' para mencionar)"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:172
|
|
||||||
msgid "Add details..."
|
|
||||||
msgstr "Añadir detalles..."
|
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:110
|
#: src/views/card/components/LabelSelector.tsx:110
|
||||||
#: src/views/card/components/LabelSelector.tsx:118
|
#: src/views/card/components/LabelSelector.tsx:118
|
||||||
@@ -92,36 +80,17 @@ msgstr "Añadir etiqueta"
|
|||||||
msgid "Add member"
|
msgid "Add member"
|
||||||
msgstr "Añadir miembro"
|
msgstr "Añadir miembro"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:69
|
#: src/views/card/components/ActivityList.tsx:56
|
||||||
msgid "added a checklist"
|
|
||||||
msgstr "añadió una lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:72
|
|
||||||
msgid "added a checklist item"
|
|
||||||
msgstr "añadió un elemento a la lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:65
|
|
||||||
msgid "added a label to the card"
|
msgid "added a label to the card"
|
||||||
msgstr "añadió una etiqueta a la tarjeta"
|
msgstr "añadió una etiqueta a la tarjeta"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:67
|
#: src/views/card/components/ActivityList.tsx:58
|
||||||
msgid "added a member to the card"
|
msgid "added a member to the card"
|
||||||
msgstr "añadió un miembro a la tarjeta"
|
msgstr "añadió un miembro a la tarjeta"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
#: src/views/card/components/ActivityList.tsx:110
|
||||||
#: src/views/card/components/ActivityList.tsx:146
|
msgid "added label <0>{label}</0>"
|
||||||
msgid "added checklist <0>{0}</0>"
|
msgstr "añadió la etiqueta <0>{label}</0>"
|
||||||
msgstr "añadió la lista de verificación <0>{0}</0>"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:170
|
|
||||||
msgid "added checklist item <0>{0}</0>"
|
|
||||||
msgstr "añadió el elemento <0>{0}</0> a la lista de verificación"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(label)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:130
|
|
||||||
msgid "added label <0>{0}</0>"
|
|
||||||
msgstr "añadió la etiqueta <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:55
|
#: src/views/home/components/Pricing.tsx:55
|
||||||
msgid "Admin roles"
|
msgid "Admin roles"
|
||||||
@@ -172,15 +141,11 @@ msgstr "¿Estás seguro de que quieres eliminar el espacio de trabajo {0}?"
|
|||||||
msgid "Are you sure you want to delete this card?"
|
msgid "Are you sure you want to delete this card?"
|
||||||
msgstr "¿Estás seguro de que quieres eliminar esta tarjeta?"
|
msgstr "¿Estás seguro de que quieres eliminar esta tarjeta?"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
|
|
||||||
msgid "Are you sure you want to delete this checklist?"
|
|
||||||
msgstr "¿Estás seguro de que quieres eliminar esta lista de verificación?"
|
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
|
||||||
msgid "Are you sure you want to delete this comment?"
|
msgid "Are you sure you want to delete this comment?"
|
||||||
msgstr "¿Estás seguro de que quieres eliminar este comentario?"
|
msgstr "¿Estás seguro de que quieres eliminar este comentario?"
|
||||||
|
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:41
|
#: src/components/DeleteLabelConfirmation.tsx:39
|
||||||
msgid "Are you sure you want to delete this label?"
|
msgid "Are you sure you want to delete this label?"
|
||||||
msgstr "¿Estás seguro de que quieres eliminar esta etiqueta?"
|
msgstr "¿Estás seguro de que quieres eliminar esta etiqueta?"
|
||||||
|
|
||||||
@@ -188,10 +153,9 @@ msgstr "¿Estás seguro de que quieres eliminar esta etiqueta?"
|
|||||||
msgid "Are you sure you want to delete your account?"
|
msgid "Are you sure you want to delete your account?"
|
||||||
msgstr "¿Estás seguro de que quieres eliminar tu cuenta?"
|
msgstr "¿Estás seguro de que quieres eliminar tu cuenta?"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(memberName)
|
#: src/views/card/components/ActivityList.tsx:92
|
||||||
#: src/views/card/components/ActivityList.tsx:110
|
msgid "assigned <0>{memberName}</0> to the card"
|
||||||
msgid "assigned <0>{0}</0> to the card"
|
msgstr "asignó a <0>{memberName}</0> a la tarjeta"
|
||||||
msgstr "asignó <0>{0}</0> a la tarjeta"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:46
|
#: src/views/boards/components/TemplateBoards.tsx:46
|
||||||
msgid "Awaiting Customer"
|
msgid "Awaiting Customer"
|
||||||
@@ -218,7 +182,7 @@ msgstr "Portal de facturación"
|
|||||||
msgid "Blog Post"
|
msgid "Blog Post"
|
||||||
msgstr "Entrada de blog"
|
msgstr "Entrada de blog"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:331
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Tablero"
|
msgstr "Tablero"
|
||||||
|
|
||||||
@@ -230,8 +194,8 @@ msgstr "El nombre del tablero no puede exceder los 100 caracteres"
|
|||||||
msgid "Board name is required"
|
msgid "Board name is required"
|
||||||
msgstr "El nombre del tablero es obligatorio"
|
msgstr "El nombre del tablero es obligatorio"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:143
|
#: src/views/public/board/index.tsx:137
|
||||||
#: src/views/board/index.tsx:357
|
#: src/views/board/index.tsx:358
|
||||||
msgid "Board not found"
|
msgid "Board not found"
|
||||||
msgstr "Tablero no encontrado"
|
msgstr "Tablero no encontrado"
|
||||||
|
|
||||||
@@ -286,18 +250,17 @@ msgstr "Informe de error"
|
|||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
||||||
#: src/views/card/components/Comment.tsx:158
|
#: src/views/card/components/Comment.tsx:156
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:49
|
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:259
|
#: src/views/card/index.tsx:234
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Tarjeta no encontrada"
|
msgstr "Tarjeta no encontrada"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:307
|
#: src/views/board/components/NewCardForm.tsx:278
|
||||||
msgid "Card title"
|
msgid "Card title"
|
||||||
msgstr "Título de la tarjeta"
|
msgstr "Título de la tarjeta"
|
||||||
|
|
||||||
@@ -310,10 +273,6 @@ msgstr "Cambiar el idioma de la aplicación."
|
|||||||
msgid "Check your inbox"
|
msgid "Check your inbox"
|
||||||
msgstr "Revisa tu bandeja de entrada"
|
msgstr "Revisa tu bandeja de entrada"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:118
|
|
||||||
msgid "Checklist name"
|
|
||||||
msgstr "Nombre de la lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/board/components/Filters.tsx:155
|
#: src/views/board/components/Filters.tsx:155
|
||||||
msgid "Clear filters"
|
msgid "Clear filters"
|
||||||
msgstr "Borrar filtros"
|
msgstr "Borrar filtros"
|
||||||
@@ -351,15 +310,6 @@ msgstr "Completado"
|
|||||||
msgid "Complete control and ownership:"
|
msgid "Complete control and ownership:"
|
||||||
msgstr "Control y propiedad completos:"
|
msgstr "Control y propiedad completos:"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:74
|
|
||||||
msgid "completed a checklist item"
|
|
||||||
msgstr "completó un elemento de la lista de verificación"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:187
|
|
||||||
msgid "completed checklist item <0>{0}</0>"
|
|
||||||
msgstr "completó el elemento <0>{0}</0> de la lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:42
|
#: src/views/settings/components/CustomURLConfirmation.tsx:42
|
||||||
msgid "Confirm URL change"
|
msgid "Confirm URL change"
|
||||||
msgstr "Confirmar cambio de URL"
|
msgstr "Confirmar cambio de URL"
|
||||||
@@ -403,8 +353,8 @@ msgid "Control who can view and edit your boards."
|
|||||||
msgstr "Controla quién puede ver y editar tus tableros."
|
msgstr "Controla quién puede ver y editar tus tableros."
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:140
|
#: src/views/board/components/NewListForm.tsx:140
|
||||||
#: src/views/board/components/NewCardForm.tsx:458
|
#: src/views/board/components/NewCardForm.tsx:418
|
||||||
#: src/components/LabelForm.tsx:213
|
#: src/components/LabelForm.tsx:212
|
||||||
msgid "Create another"
|
msgid "Create another"
|
||||||
msgstr "Crear otro"
|
msgstr "Crear otro"
|
||||||
|
|
||||||
@@ -412,15 +362,11 @@ msgstr "Crear otro"
|
|||||||
msgid "Create board"
|
msgid "Create board"
|
||||||
msgstr "Crear tablero"
|
msgstr "Crear tablero"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:468
|
#: src/views/board/components/NewCardForm.tsx:428
|
||||||
msgid "Create card"
|
msgid "Create card"
|
||||||
msgstr "Crear tarjeta"
|
msgstr "Crear tarjeta"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:134
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Create checklist"
|
|
||||||
msgstr "Crear lista de verificación"
|
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:238
|
|
||||||
msgid "Create label"
|
msgid "Create label"
|
||||||
msgstr "Crear etiqueta"
|
msgstr "Crear etiqueta"
|
||||||
|
|
||||||
@@ -437,11 +383,11 @@ msgid "Create new key"
|
|||||||
msgstr "Crear nueva clave"
|
msgstr "Crear nueva clave"
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:98
|
#: src/views/card/components/LabelSelector.tsx:98
|
||||||
#: src/views/board/components/NewCardForm.tsx:394
|
#: src/views/board/components/NewCardForm.tsx:354
|
||||||
msgid "Create new label"
|
msgid "Create new label"
|
||||||
msgstr "Crear nueva etiqueta"
|
msgstr "Crear nueva etiqueta"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:425
|
#: src/views/board/index.tsx:426
|
||||||
msgid "Create new list"
|
msgid "Create new list"
|
||||||
msgstr "Crear nueva lista"
|
msgstr "Crear nueva lista"
|
||||||
|
|
||||||
@@ -450,7 +396,7 @@ msgstr "Crear nueva lista"
|
|||||||
msgid "Create workspace"
|
msgid "Create workspace"
|
||||||
msgstr "Crear espacio de trabajo"
|
msgstr "Crear espacio de trabajo"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:61
|
#: src/views/card/components/ActivityList.tsx:52
|
||||||
msgid "created the card"
|
msgid "created the card"
|
||||||
msgstr "creó la tarjeta"
|
msgstr "creó la tarjeta"
|
||||||
|
|
||||||
@@ -475,10 +421,9 @@ msgid "Dark"
|
|||||||
msgstr "Oscuro"
|
msgstr "Oscuro"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||||
#: src/components/LabelForm.tsx:228
|
#: src/components/LabelForm.tsx:226
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:51
|
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Eliminar"
|
msgstr "Eliminar"
|
||||||
|
|
||||||
@@ -492,11 +437,11 @@ msgstr "Eliminar cuenta"
|
|||||||
msgid "Delete board"
|
msgid "Delete board"
|
||||||
msgstr "Eliminar tablero"
|
msgstr "Eliminar tablero"
|
||||||
|
|
||||||
#: src/views/card/components/Dropdown.tsx:25
|
#: src/views/card/components/Dropdown.tsx:14
|
||||||
msgid "Delete card"
|
msgid "Delete card"
|
||||||
msgstr "Eliminar tarjeta"
|
msgstr "Eliminar tarjeta"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:91
|
#: src/views/card/components/Comment.tsx:89
|
||||||
msgid "Delete comment"
|
msgid "Delete comment"
|
||||||
msgstr "Eliminar comentario"
|
msgstr "Eliminar comentario"
|
||||||
|
|
||||||
@@ -510,24 +455,6 @@ msgstr "Eliminar lista"
|
|||||||
msgid "Delete workspace"
|
msgid "Delete workspace"
|
||||||
msgstr "Eliminar espacio de trabajo"
|
msgstr "Eliminar espacio de trabajo"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:71
|
|
||||||
msgid "deleted a checklist"
|
|
||||||
msgstr "eliminó una lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:76
|
|
||||||
msgid "deleted a checklist item"
|
|
||||||
msgstr "eliminó un elemento de la lista de verificación"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:162
|
|
||||||
msgid "deleted checklist <0>{0}</0>"
|
|
||||||
msgstr "eliminó la lista de verificación <0>{0}</0>"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:205
|
|
||||||
msgid "deleted checklist item <0>{0}</0>"
|
|
||||||
msgstr "eliminó el elemento <0>{0}</0> de la lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:32
|
#: src/views/boards/components/TemplateBoards.tsx:32
|
||||||
msgid "Design"
|
msgid "Design"
|
||||||
msgstr "Diseño"
|
msgstr "Diseño"
|
||||||
@@ -590,11 +517,11 @@ msgstr "Terminado"
|
|||||||
msgid "Edit board URL"
|
msgid "Edit board URL"
|
||||||
msgstr "Editar URL del tablero"
|
msgstr "Editar URL del tablero"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:82
|
#: src/views/card/components/Comment.tsx:80
|
||||||
msgid "Edit comment"
|
msgid "Edit comment"
|
||||||
msgstr "Editar comentario"
|
msgstr "Editar comentario"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:119
|
#: src/components/LabelForm.tsx:118
|
||||||
msgid "Edit label"
|
msgid "Edit label"
|
||||||
msgstr "Editar etiqueta"
|
msgstr "Editar etiqueta"
|
||||||
|
|
||||||
@@ -634,7 +561,7 @@ msgstr "Introduce tu contraseña"
|
|||||||
msgid "Error deleting account"
|
msgid "Error deleting account"
|
||||||
msgstr "Error al eliminar la cuenta"
|
msgstr "Error al eliminar la cuenta"
|
||||||
|
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:25
|
#: src/components/DeleteLabelConfirmation.tsx:22
|
||||||
msgid "Error deleting label"
|
msgid "Error deleting label"
|
||||||
msgstr "Error al eliminar la etiqueta"
|
msgstr "Error al eliminar la etiqueta"
|
||||||
|
|
||||||
@@ -733,6 +660,7 @@ msgstr "Encuentra respuestas a preguntas frecuentes sobre el proyecto. ¿No encu
|
|||||||
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
|
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
|
||||||
msgstr "Para la sostenibilidad a largo plazo, reconocemos que todos los buenos proyectos de código abierto necesitan una fuente de ingresos. La nuestra proviene de la oferta de pago en la nube para espacios de trabajo con múltiples usuarios (gratuita durante la beta) y para slugs personalizados de espacios de trabajo. No hay obligación de usarla, y puedes autoalojar el software en tu propia infraestructura sin costo alguno."
|
msgstr "Para la sostenibilidad a largo plazo, reconocemos que todos los buenos proyectos de código abierto necesitan una fuente de ingresos. La nuestra proviene de la oferta de pago en la nube para espacios de trabajo con múltiples usuarios (gratuita durante la beta) y para slugs personalizados de espacios de trabajo. No hay obligación de usarla, y puedes autoalojar el software en tu propia infraestructura sin costo alguno."
|
||||||
|
|
||||||
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
#: src/views/home/components/Pricing.tsx:32
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Gratis"
|
msgstr "Gratis"
|
||||||
@@ -765,7 +693,7 @@ msgstr "Comenzar"
|
|||||||
msgid "Get started by creating a new board"
|
msgid "Get started by creating a new board"
|
||||||
msgstr "Comienza creando un nuevo tablero"
|
msgstr "Comienza creando un nuevo tablero"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:417
|
#: src/views/board/index.tsx:418
|
||||||
msgid "Get started by creating a new list"
|
msgid "Get started by creating a new list"
|
||||||
msgstr "Comienza creando una nueva lista"
|
msgstr "Comienza creando una nueva lista"
|
||||||
|
|
||||||
@@ -922,8 +850,8 @@ msgstr "Kanban reinventado"
|
|||||||
msgid "Keep in mind that this action is irreversible."
|
msgid "Keep in mind that this action is irreversible."
|
||||||
msgstr "Ten en cuenta que esta acción es irreversible."
|
msgstr "Ten en cuenta que esta acción es irreversible."
|
||||||
|
|
||||||
#: src/views/card/index.tsx:118
|
#: src/views/card/index.tsx:113
|
||||||
#: src/views/board/components/NewCardForm.tsx:398
|
#: src/views/board/components/NewCardForm.tsx:358
|
||||||
#: src/views/board/components/Filters.tsx:101
|
#: src/views/board/components/Filters.tsx:101
|
||||||
msgid "Labels"
|
msgid "Labels"
|
||||||
msgstr "Etiquetas"
|
msgstr "Etiquetas"
|
||||||
@@ -956,7 +884,7 @@ msgstr "Claro"
|
|||||||
msgid "Link copied"
|
msgid "Link copied"
|
||||||
msgstr "Enlace copiado"
|
msgstr "Enlace copiado"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:110
|
#: src/views/card/index.tsx:105
|
||||||
msgid "List"
|
msgid "List"
|
||||||
msgstr "Lista"
|
msgstr "Lista"
|
||||||
|
|
||||||
@@ -984,22 +912,13 @@ msgstr "Prioridad baja"
|
|||||||
msgid "magic link"
|
msgid "magic link"
|
||||||
msgstr "enlace mágico"
|
msgstr "enlace mágico"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:75
|
|
||||||
msgid "marked a checklist item as incomplete"
|
|
||||||
msgstr "marcó un elemento de la lista de verificación como incompleto"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:196
|
|
||||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
|
||||||
msgstr "marcó el elemento <0>{0}</0> de la lista de verificación como incompleto"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:17
|
#: src/views/boards/components/TemplateBoards.tsx:17
|
||||||
msgid "Medium Priority"
|
msgid "Medium Priority"
|
||||||
msgstr "Prioridad media"
|
msgstr "Prioridad media"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:161
|
#: src/views/members/index.tsx:161
|
||||||
#: src/views/card/index.tsx:126
|
#: src/views/card/index.tsx:121
|
||||||
#: src/views/board/components/NewCardForm.tsx:357
|
#: src/views/board/components/NewCardForm.tsx:317
|
||||||
#: src/views/board/components/Filters.tsx:93
|
#: src/views/board/components/Filters.tsx:93
|
||||||
#: src/components/SideNavigation.tsx:73
|
#: src/components/SideNavigation.tsx:73
|
||||||
msgid "Members"
|
msgid "Members"
|
||||||
@@ -1014,18 +933,16 @@ msgstr "Miembros | {0}"
|
|||||||
msgid "Monthly"
|
msgid "Monthly"
|
||||||
msgstr "Mensual"
|
msgstr "Mensual"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromList)
|
#: src/views/card/components/ActivityList.tsx:81
|
||||||
#. placeholder {1}: truncate(toList)
|
msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||||
#: src/views/card/components/ActivityList.tsx:98
|
msgstr "movió la tarjeta de <0>{fromList}</0> a<1>{toList}</1>"
|
||||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
|
||||||
msgstr "movió la tarjeta de <0>{0}</0> a<1>{1}</1>"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:64
|
#: src/views/card/components/ActivityList.tsx:55
|
||||||
msgid "moved the card to another list"
|
msgid "moved the card to another list"
|
||||||
msgstr "movió la tarjeta a otra lista"
|
msgstr "movió la tarjeta a otra lista"
|
||||||
|
|
||||||
#: src/views/boards/components/NewBoardForm.tsx:99
|
#: src/views/boards/components/NewBoardForm.tsx:99
|
||||||
#: src/components/LabelForm.tsx:135
|
#: src/components/LabelForm.tsx:134
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nombre"
|
msgstr "Nombre"
|
||||||
|
|
||||||
@@ -1041,23 +958,19 @@ msgstr "Nuevo"
|
|||||||
msgid "New board"
|
msgid "New board"
|
||||||
msgstr "Nuevo tablero"
|
msgstr "Nuevo tablero"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:290
|
#: src/views/board/components/NewCardForm.tsx:261
|
||||||
msgid "New card"
|
msgid "New card"
|
||||||
msgstr "Nueva tarjeta"
|
msgstr "Nueva tarjeta"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:102
|
|
||||||
msgid "New checklist"
|
|
||||||
msgstr "Nueva lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
||||||
msgid "New import"
|
msgid "New import"
|
||||||
msgstr "Nueva importación"
|
msgstr "Nueva importación"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:119
|
#: src/components/LabelForm.tsx:118
|
||||||
msgid "New label"
|
msgid "New label"
|
||||||
msgstr "Nueva etiqueta"
|
msgstr "Nueva etiqueta"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:394
|
#: src/views/board/index.tsx:395
|
||||||
#: src/views/board/components/NewListForm.tsx:112
|
#: src/views/board/components/NewListForm.tsx:112
|
||||||
msgid "New list"
|
msgid "New list"
|
||||||
msgstr "Nueva lista"
|
msgstr "Nueva lista"
|
||||||
@@ -1090,7 +1003,7 @@ msgstr "No se encontraron tableros"
|
|||||||
msgid "No credit card required"
|
msgid "No credit card required"
|
||||||
msgstr "No se requiere tarjeta de crédito"
|
msgstr "No se requiere tarjeta de crédito"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:414
|
#: src/views/board/index.tsx:415
|
||||||
msgid "No lists"
|
msgid "No lists"
|
||||||
msgstr "Sin listas"
|
msgstr "Sin listas"
|
||||||
|
|
||||||
@@ -1173,30 +1086,24 @@ msgstr "Por favor selecciona un archivo para subir."
|
|||||||
#: src/views/settings/components/Avatar.tsx:98
|
#: src/views/settings/components/Avatar.tsx:98
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/card/index.tsx:173
|
#: src/views/card/index.tsx:159
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
|
||||||
#: src/views/card/components/MemberSelector.tsx:80
|
#: src/views/card/components/MemberSelector.tsx:80
|
||||||
#: src/views/card/components/ListSelector.tsx:53
|
#: src/views/card/components/ListSelector.tsx:53
|
||||||
#: src/views/card/components/LabelSelector.tsx:73
|
#: src/views/card/components/LabelSelector.tsx:73
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
||||||
#: src/views/card/components/Comment.tsx:64
|
#: src/views/card/components/Comment.tsx:62
|
||||||
#: src/views/card/components/ChecklistNameInput.tsx:46
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:60
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:88
|
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
||||||
#: src/views/board/index.tsx:134
|
#: src/views/board/index.tsx:135
|
||||||
#: src/views/board/index.tsx:190
|
#: src/views/board/index.tsx:191
|
||||||
#: src/views/board/components/VisibilityButton.tsx:53
|
#: src/views/board/components/VisibilityButton.tsx:53
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||||
#: src/views/board/components/NewListForm.tsx:78
|
#: src/views/board/components/NewListForm.tsx:78
|
||||||
#: src/views/board/components/NewCardForm.tsx:174
|
#: src/views/board/components/NewCardForm.tsx:145
|
||||||
#: src/components/NewWorkspaceForm.tsx:41
|
#: src/components/NewWorkspaceForm.tsx:41
|
||||||
#: src/components/FeedbackModal.tsx:41
|
#: src/components/FeedbackModal.tsx:41
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
#: src/components/DeleteLabelConfirmation.tsx:23
|
||||||
msgid "Please try again later, or contact customer support."
|
msgid "Please try again later, or contact customer support."
|
||||||
msgstr "Por favor, inténtalo de nuevo más tarde o contacta con atención al cliente."
|
msgstr "Por favor, inténtalo de nuevo más tarde o contacta con atención al cliente."
|
||||||
|
|
||||||
@@ -1262,32 +1169,17 @@ msgstr "Eliminar"
|
|||||||
msgid "Remove member"
|
msgid "Remove member"
|
||||||
msgstr "Eliminar miembro"
|
msgstr "Eliminar miembro"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:66
|
#: src/views/card/components/ActivityList.tsx:57
|
||||||
msgid "removed a label from the card"
|
msgid "removed a label from the card"
|
||||||
msgstr "eliminó una etiqueta de la tarjeta"
|
msgstr "eliminó una etiqueta de la tarjeta"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:68
|
#: src/views/card/components/ActivityList.tsx:59
|
||||||
msgid "removed a member from the card"
|
msgid "removed a member from the card"
|
||||||
msgstr "eliminó un miembro de la tarjeta"
|
msgstr "eliminó un miembro de la tarjeta"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(label)
|
#: src/views/card/components/ActivityList.tsx:118
|
||||||
#: src/views/card/components/ActivityList.tsx:138
|
msgid "removed label <0>{label}</0>"
|
||||||
msgid "removed label <0>{0}</0>"
|
msgstr "eliminó la etiqueta <0>{label}</0>"
|
||||||
msgstr "eliminó la etiqueta <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:70
|
|
||||||
msgid "renamed a checklist"
|
|
||||||
msgstr "renombró una lista de verificación"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:154
|
|
||||||
msgid "renamed checklist <0>{0}</0>"
|
|
||||||
msgstr "renombró la lista de verificación <0>{0}</0>"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:178
|
|
||||||
msgid "renamed checklist item to <0>{0}</0>"
|
|
||||||
msgstr "renombró el elemento de la lista de verificación a <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:76
|
#: src/views/boards/components/TemplateBoards.tsx:76
|
||||||
msgid "Research"
|
msgid "Research"
|
||||||
@@ -1322,7 +1214,7 @@ msgstr "Rol"
|
|||||||
msgid "Run on your own infrastructure"
|
msgid "Run on your own infrastructure"
|
||||||
msgstr "Ejecuta en tu propia infraestructura"
|
msgstr "Ejecuta en tu propia infraestructura"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:165
|
#: src/views/card/components/Comment.tsx:163
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Guardar"
|
msgstr "Guardar"
|
||||||
|
|
||||||
@@ -1350,7 +1242,7 @@ msgstr "Autoalojamiento"
|
|||||||
msgid "Self host with Github"
|
msgid "Self host with Github"
|
||||||
msgstr "Autoalojamiento con Github"
|
msgstr "Autoalojamiento con Github"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:107
|
#: src/views/card/components/ActivityList.tsx:89
|
||||||
msgid "self-assigned the card"
|
msgid "self-assigned the card"
|
||||||
msgstr "se autoasignó la tarjeta"
|
msgstr "se autoasignó la tarjeta"
|
||||||
|
|
||||||
@@ -1469,13 +1361,12 @@ msgid "They won't be able to access this workspace."
|
|||||||
msgstr "No podrán acceder a este espacio de trabajo."
|
msgstr "No podrán acceder a este espacio de trabajo."
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:44
|
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||||
msgid "This action can't be undone."
|
msgid "This action can't be undone."
|
||||||
msgstr "Esta acción no se puede deshacer."
|
msgstr "Esta acción no se puede deshacer."
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:146
|
#: src/views/public/board/index.tsx:140
|
||||||
msgid "This board is private or does not exist"
|
msgid "This board is private or does not exist"
|
||||||
msgstr "Este tablero es privado o no existe"
|
msgstr "Este tablero es privado o no existe"
|
||||||
|
|
||||||
@@ -1520,22 +1411,14 @@ msgstr "Importaciones de Trello"
|
|||||||
msgid "Triaging"
|
msgid "Triaging"
|
||||||
msgstr "Clasificación"
|
msgstr "Clasificación"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:88
|
|
||||||
msgid "Unable to add checklist item"
|
|
||||||
msgstr "No se puede añadir el elemento a la lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/card/components/NewCommentForm.tsx:30
|
#: src/views/card/components/NewCommentForm.tsx:30
|
||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "No se puede añadir el comentario"
|
msgstr "No se puede añadir el comentario"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:171
|
#: src/views/board/components/NewCardForm.tsx:142
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "No se puede crear la tarjeta"
|
msgstr "No se puede crear la tarjeta"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:69
|
|
||||||
msgid "Unable to create checklist"
|
|
||||||
msgstr "No se puede crear la lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:77
|
#: src/views/board/components/NewListForm.tsx:77
|
||||||
msgid "Unable to create list"
|
msgid "Unable to create list"
|
||||||
msgstr "No se puede crear la lista"
|
msgstr "No se puede crear la lista"
|
||||||
@@ -1548,14 +1431,6 @@ msgstr "No se puede crear el espacio de trabajo"
|
|||||||
msgid "Unable to delete card"
|
msgid "Unable to delete card"
|
||||||
msgstr "No se puede eliminar la tarjeta"
|
msgstr "No se puede eliminar la tarjeta"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
|
|
||||||
msgid "Unable to delete checklist"
|
|
||||||
msgstr "No se puede eliminar la lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:87
|
|
||||||
msgid "Unable to delete checklist item"
|
|
||||||
msgstr "No se puede eliminar el elemento de la lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
|
||||||
msgid "Unable to delete comment"
|
msgid "Unable to delete comment"
|
||||||
msgstr "No se puede eliminar el comentario"
|
msgstr "No se puede eliminar el comentario"
|
||||||
@@ -1576,20 +1451,12 @@ msgstr "No se puede actualizar la URL del tablero"
|
|||||||
msgid "Unable to update board visibility"
|
msgid "Unable to update board visibility"
|
||||||
msgstr "No se puede actualizar la visibilidad del tablero"
|
msgstr "No se puede actualizar la visibilidad del tablero"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:172
|
#: src/views/card/index.tsx:158
|
||||||
#: src/views/board/index.tsx:189
|
#: src/views/board/index.tsx:190
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "No se puede actualizar la tarjeta"
|
msgstr "No se puede actualizar la tarjeta"
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistNameInput.tsx:45
|
#: src/views/card/components/Comment.tsx:61
|
||||||
msgid "Unable to update checklist"
|
|
||||||
msgstr "No se puede actualizar la lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:59
|
|
||||||
msgid "Unable to update checklist item"
|
|
||||||
msgstr "No se puede actualizar el elemento de la lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:63
|
|
||||||
msgid "Unable to update comment"
|
msgid "Unable to update comment"
|
||||||
msgstr "No se puede actualizar el comentario"
|
msgstr "No se puede actualizar el comentario"
|
||||||
|
|
||||||
@@ -1598,7 +1465,7 @@ msgid "Unable to update labels"
|
|||||||
msgstr "No se pueden actualizar las etiquetas"
|
msgstr "No se pueden actualizar las etiquetas"
|
||||||
|
|
||||||
#: src/views/card/components/ListSelector.tsx:52
|
#: src/views/card/components/ListSelector.tsx:52
|
||||||
#: src/views/board/index.tsx:133
|
#: src/views/board/index.tsx:134
|
||||||
msgid "Unable to update list"
|
msgid "Unable to update list"
|
||||||
msgstr "No se puede actualizar la lista"
|
msgstr "No se puede actualizar la lista"
|
||||||
|
|
||||||
@@ -1606,12 +1473,11 @@ msgstr "No se puede actualizar la lista"
|
|||||||
msgid "Unable to update members"
|
msgid "Unable to update members"
|
||||||
msgstr "No se pueden actualizar los miembros"
|
msgstr "No se pueden actualizar los miembros"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(memberName)
|
#: src/views/card/components/ActivityList.tsx:102
|
||||||
#: src/views/card/components/ActivityList.tsx:121
|
msgid "unassigned <0>{memberName}</0> from the card"
|
||||||
msgid "unassigned <0>{0}</0> from the card"
|
msgstr "desasignó a <0>{memberName}</0> de la tarjeta"
|
||||||
msgstr "desasignó <0>{0}</0> de la tarjeta"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:118
|
#: src/views/card/components/ActivityList.tsx:99
|
||||||
msgid "unassigned themselves from the card"
|
msgid "unassigned themselves from the card"
|
||||||
msgstr "se desasignó de la tarjeta"
|
msgstr "se desasignó de la tarjeta"
|
||||||
|
|
||||||
@@ -1647,26 +1513,21 @@ msgstr "Listas ilimitadas"
|
|||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Actualizar"
|
msgstr "Actualizar"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:238
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Update label"
|
msgid "Update label"
|
||||||
msgstr "Actualizar etiqueta"
|
msgstr "Actualizar etiqueta"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:73
|
#: src/views/card/components/ActivityList.tsx:54
|
||||||
msgid "updated a checklist item"
|
|
||||||
msgstr "actualizó un elemento de la lista de verificación"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:63
|
|
||||||
msgid "updated the description"
|
msgid "updated the description"
|
||||||
msgstr "actualizó la descripción"
|
msgstr "actualizó la descripción"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:62
|
#: src/views/card/components/ActivityList.tsx:53
|
||||||
msgid "updated the title"
|
msgid "updated the title"
|
||||||
msgstr "actualizó el título"
|
msgstr "actualizó el título"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
#: src/views/card/components/ActivityList.tsx:73
|
||||||
#: src/views/card/components/ActivityList.tsx:90
|
msgid "updated the title to <0>{toTitle}</0>"
|
||||||
msgid "updated the title to <0>{0}</0>"
|
msgstr "actualizó el título a <0>{toTitle}</0>"
|
||||||
msgstr "actualizó el título a <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
||||||
msgid "Upgrade"
|
msgid "Upgrade"
|
||||||
@@ -1717,15 +1578,11 @@ msgstr "Ver y gestionar tu facturación y suscripción."
|
|||||||
msgid "View docs"
|
msgid "View docs"
|
||||||
msgstr "Ver documentación"
|
msgstr "Ver documentación"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:120
|
|
||||||
msgid "View only"
|
|
||||||
msgstr "Solo visualización"
|
|
||||||
|
|
||||||
#: src/views/home/components/Features.tsx:147
|
#: src/views/home/components/Features.tsx:147
|
||||||
msgid "View our roadmap."
|
msgid "View our roadmap."
|
||||||
msgstr "Ver nuestra hoja de ruta."
|
msgstr "Ver nuestra hoja de ruta."
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:149
|
#: src/views/public/board/index.tsx:143
|
||||||
msgid "View workspace"
|
msgid "View workspace"
|
||||||
msgstr "Ver espacio de trabajo"
|
msgstr "Ver espacio de trabajo"
|
||||||
|
|
||||||
@@ -1761,7 +1618,7 @@ msgstr "Cuando Trello se lanzó en 2011, impresionó a todos con su simplicidad
|
|||||||
msgid "Why make an open source Trello?"
|
msgid "Why make an open source Trello?"
|
||||||
msgstr "¿Por qué crear un Trello de código abierto?"
|
msgstr "¿Por qué crear un Trello de código abierto?"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:331
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Workspace"
|
msgid "Workspace"
|
||||||
msgstr "Espacio de trabajo"
|
msgstr "Espacio de trabajo"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Plural-Forms: \n"
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:123
|
#: src/views/card/components/Comment.tsx:121
|
||||||
msgid " (edited)"
|
msgid " (edited)"
|
||||||
msgstr " (modifié)"
|
msgstr " (modifié)"
|
||||||
|
|
||||||
@@ -23,12 +23,12 @@ msgstr ", ou consultez notre"
|
|||||||
|
|
||||||
#. placeholder {0}: card?.title ?? "Card"
|
#. placeholder {0}: card?.title ?? "Card"
|
||||||
#. placeholder {1}: board?.name ?? "Board"
|
#. placeholder {1}: board?.name ?? "Board"
|
||||||
#: src/views/card/index.tsx:214
|
#: src/views/card/index.tsx:189
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
#. placeholder {0}: labelPublicIds.length
|
#. placeholder {0}: labelPublicIds.length
|
||||||
#: src/views/board/components/NewCardForm.tsx:432
|
#: src/views/board/components/NewCardForm.tsx:392
|
||||||
msgid "{0} labels"
|
msgid "{0} labels"
|
||||||
msgstr "{0} étiquettes"
|
msgstr "{0} étiquettes"
|
||||||
|
|
||||||
@@ -48,8 +48,8 @@ msgstr "Une application kanban puissante et flexible qui vous aide à organiser
|
|||||||
msgid "Account deleted"
|
msgid "Account deleted"
|
||||||
msgstr "Compte supprimé"
|
msgstr "Compte supprimé"
|
||||||
|
|
||||||
#: src/views/public/board/CardModal.tsx:140
|
#: src/views/public/board/CardModal.tsx:104
|
||||||
#: src/views/card/index.tsx:288
|
#: src/views/card/index.tsx:256
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Activité"
|
msgstr "Activité"
|
||||||
|
|
||||||
@@ -62,25 +62,13 @@ msgid "Add a card"
|
|||||||
msgstr "Ajouter une carte"
|
msgstr "Ajouter une carte"
|
||||||
|
|
||||||
#: src/views/card/components/NewCommentForm.tsx:57
|
#: src/views/card/components/NewCommentForm.tsx:57
|
||||||
#: src/views/card/components/Comment.tsx:146
|
#: src/views/card/components/Comment.tsx:144
|
||||||
msgid "Add a comment..."
|
msgid "Add a comment..."
|
||||||
msgstr "Ajouter un commentaire..."
|
msgstr "Ajouter un commentaire..."
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:140
|
#: src/components/Editor.tsx:303
|
||||||
msgid "Add an item..."
|
msgid "Add description... (type '/' to open commands)"
|
||||||
msgstr "Ajouter un élément..."
|
msgstr "Ajouter une description... (tapez '/' pour ouvrir les commandes)"
|
||||||
|
|
||||||
#: src/views/card/components/Dropdown.tsx:18
|
|
||||||
msgid "Add checklist"
|
|
||||||
msgstr "Ajouter une checklist"
|
|
||||||
|
|
||||||
#: src/components/Editor.tsx:442
|
|
||||||
msgid "Add description... (type '/' to open commands or '@' to mention)"
|
|
||||||
msgstr "Ajouter une description... (tapez '/' pour ouvrir les commandes ou '@' pour mentionner)"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:172
|
|
||||||
msgid "Add details..."
|
|
||||||
msgstr "Ajouter des détails..."
|
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:110
|
#: src/views/card/components/LabelSelector.tsx:110
|
||||||
#: src/views/card/components/LabelSelector.tsx:118
|
#: src/views/card/components/LabelSelector.tsx:118
|
||||||
@@ -92,36 +80,17 @@ msgstr "Ajouter une étiquette"
|
|||||||
msgid "Add member"
|
msgid "Add member"
|
||||||
msgstr "Ajouter un membre"
|
msgstr "Ajouter un membre"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:69
|
#: src/views/card/components/ActivityList.tsx:56
|
||||||
msgid "added a checklist"
|
|
||||||
msgstr "a ajouté une checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:72
|
|
||||||
msgid "added a checklist item"
|
|
||||||
msgstr "a ajouté un élément à la checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:65
|
|
||||||
msgid "added a label to the card"
|
msgid "added a label to the card"
|
||||||
msgstr "a ajouté une étiquette à la carte"
|
msgstr "a ajouté une étiquette à la carte"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:67
|
#: src/views/card/components/ActivityList.tsx:58
|
||||||
msgid "added a member to the card"
|
msgid "added a member to the card"
|
||||||
msgstr "a ajouté un membre à la carte"
|
msgstr "a ajouté un membre à la carte"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
#: src/views/card/components/ActivityList.tsx:110
|
||||||
#: src/views/card/components/ActivityList.tsx:146
|
msgid "added label <0>{label}</0>"
|
||||||
msgid "added checklist <0>{0}</0>"
|
msgstr "a ajouté l'étiquette <0>{label}</0>"
|
||||||
msgstr "a ajouté la checklist <0>{0}</0>"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:170
|
|
||||||
msgid "added checklist item <0>{0}</0>"
|
|
||||||
msgstr "a ajouté l'élément <0>{0}</0> à la checklist"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(label)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:130
|
|
||||||
msgid "added label <0>{0}</0>"
|
|
||||||
msgstr "a ajouté l'étiquette <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:55
|
#: src/views/home/components/Pricing.tsx:55
|
||||||
msgid "Admin roles"
|
msgid "Admin roles"
|
||||||
@@ -172,15 +141,11 @@ msgstr "Êtes-vous sûr de vouloir supprimer l'espace de travail {0} ?"
|
|||||||
msgid "Are you sure you want to delete this card?"
|
msgid "Are you sure you want to delete this card?"
|
||||||
msgstr "Êtes-vous sûr de vouloir supprimer cette carte ?"
|
msgstr "Êtes-vous sûr de vouloir supprimer cette carte ?"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
|
|
||||||
msgid "Are you sure you want to delete this checklist?"
|
|
||||||
msgstr "Êtes-vous sûr de vouloir supprimer cette checklist ?"
|
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
|
||||||
msgid "Are you sure you want to delete this comment?"
|
msgid "Are you sure you want to delete this comment?"
|
||||||
msgstr "Êtes-vous sûr de vouloir supprimer ce commentaire ?"
|
msgstr "Êtes-vous sûr de vouloir supprimer ce commentaire ?"
|
||||||
|
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:41
|
#: src/components/DeleteLabelConfirmation.tsx:39
|
||||||
msgid "Are you sure you want to delete this label?"
|
msgid "Are you sure you want to delete this label?"
|
||||||
msgstr "Êtes-vous sûr de vouloir supprimer cette étiquette ?"
|
msgstr "Êtes-vous sûr de vouloir supprimer cette étiquette ?"
|
||||||
|
|
||||||
@@ -188,10 +153,9 @@ msgstr "Êtes-vous sûr de vouloir supprimer cette étiquette ?"
|
|||||||
msgid "Are you sure you want to delete your account?"
|
msgid "Are you sure you want to delete your account?"
|
||||||
msgstr "Êtes-vous sûr de vouloir supprimer votre compte ?"
|
msgstr "Êtes-vous sûr de vouloir supprimer votre compte ?"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(memberName)
|
#: src/views/card/components/ActivityList.tsx:92
|
||||||
#: src/views/card/components/ActivityList.tsx:110
|
msgid "assigned <0>{memberName}</0> to the card"
|
||||||
msgid "assigned <0>{0}</0> to the card"
|
msgstr "a assigné <0>{memberName}</0> à la carte"
|
||||||
msgstr "a assigné <0>{0}</0> à la carte"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:46
|
#: src/views/boards/components/TemplateBoards.tsx:46
|
||||||
msgid "Awaiting Customer"
|
msgid "Awaiting Customer"
|
||||||
@@ -218,7 +182,7 @@ msgstr "Portail de facturation"
|
|||||||
msgid "Blog Post"
|
msgid "Blog Post"
|
||||||
msgstr "Article de blog"
|
msgstr "Article de blog"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:331
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Tableau"
|
msgstr "Tableau"
|
||||||
|
|
||||||
@@ -230,8 +194,8 @@ msgstr "Le nom du tableau ne peut pas dépasser 100 caractères"
|
|||||||
msgid "Board name is required"
|
msgid "Board name is required"
|
||||||
msgstr "Le nom du tableau est requis"
|
msgstr "Le nom du tableau est requis"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:143
|
#: src/views/public/board/index.tsx:137
|
||||||
#: src/views/board/index.tsx:357
|
#: src/views/board/index.tsx:358
|
||||||
msgid "Board not found"
|
msgid "Board not found"
|
||||||
msgstr "Tableau introuvable"
|
msgstr "Tableau introuvable"
|
||||||
|
|
||||||
@@ -286,18 +250,17 @@ msgstr "Rapport de bug"
|
|||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
||||||
#: src/views/card/components/Comment.tsx:158
|
#: src/views/card/components/Comment.tsx:156
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:49
|
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuler"
|
msgstr "Annuler"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:259
|
#: src/views/card/index.tsx:234
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Carte introuvable"
|
msgstr "Carte introuvable"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:307
|
#: src/views/board/components/NewCardForm.tsx:278
|
||||||
msgid "Card title"
|
msgid "Card title"
|
||||||
msgstr "Titre de la carte"
|
msgstr "Titre de la carte"
|
||||||
|
|
||||||
@@ -310,10 +273,6 @@ msgstr "Changer la langue de l'application."
|
|||||||
msgid "Check your inbox"
|
msgid "Check your inbox"
|
||||||
msgstr "Vérifiez votre boîte de réception"
|
msgstr "Vérifiez votre boîte de réception"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:118
|
|
||||||
msgid "Checklist name"
|
|
||||||
msgstr "Nom de la checklist"
|
|
||||||
|
|
||||||
#: src/views/board/components/Filters.tsx:155
|
#: src/views/board/components/Filters.tsx:155
|
||||||
msgid "Clear filters"
|
msgid "Clear filters"
|
||||||
msgstr "Effacer les filtres"
|
msgstr "Effacer les filtres"
|
||||||
@@ -351,15 +310,6 @@ msgstr "Terminé"
|
|||||||
msgid "Complete control and ownership:"
|
msgid "Complete control and ownership:"
|
||||||
msgstr "Contrôle et propriété complets :"
|
msgstr "Contrôle et propriété complets :"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:74
|
|
||||||
msgid "completed a checklist item"
|
|
||||||
msgstr "a terminé un élément de la checklist"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:187
|
|
||||||
msgid "completed checklist item <0>{0}</0>"
|
|
||||||
msgstr "a terminé l'élément <0>{0}</0> de la checklist"
|
|
||||||
|
|
||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:42
|
#: src/views/settings/components/CustomURLConfirmation.tsx:42
|
||||||
msgid "Confirm URL change"
|
msgid "Confirm URL change"
|
||||||
msgstr "Confirmer le changement d'URL"
|
msgstr "Confirmer le changement d'URL"
|
||||||
@@ -403,8 +353,8 @@ msgid "Control who can view and edit your boards."
|
|||||||
msgstr "Contrôlez qui peut voir et modifier vos tableaux."
|
msgstr "Contrôlez qui peut voir et modifier vos tableaux."
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:140
|
#: src/views/board/components/NewListForm.tsx:140
|
||||||
#: src/views/board/components/NewCardForm.tsx:458
|
#: src/views/board/components/NewCardForm.tsx:418
|
||||||
#: src/components/LabelForm.tsx:213
|
#: src/components/LabelForm.tsx:212
|
||||||
msgid "Create another"
|
msgid "Create another"
|
||||||
msgstr "Créer un autre"
|
msgstr "Créer un autre"
|
||||||
|
|
||||||
@@ -412,15 +362,11 @@ msgstr "Créer un autre"
|
|||||||
msgid "Create board"
|
msgid "Create board"
|
||||||
msgstr "Créer un tableau"
|
msgstr "Créer un tableau"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:468
|
#: src/views/board/components/NewCardForm.tsx:428
|
||||||
msgid "Create card"
|
msgid "Create card"
|
||||||
msgstr "Créer une carte"
|
msgstr "Créer une carte"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:134
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Create checklist"
|
|
||||||
msgstr "Créer une checklist"
|
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:238
|
|
||||||
msgid "Create label"
|
msgid "Create label"
|
||||||
msgstr "Créer une étiquette"
|
msgstr "Créer une étiquette"
|
||||||
|
|
||||||
@@ -437,11 +383,11 @@ msgid "Create new key"
|
|||||||
msgstr "Créer une nouvelle clé"
|
msgstr "Créer une nouvelle clé"
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:98
|
#: src/views/card/components/LabelSelector.tsx:98
|
||||||
#: src/views/board/components/NewCardForm.tsx:394
|
#: src/views/board/components/NewCardForm.tsx:354
|
||||||
msgid "Create new label"
|
msgid "Create new label"
|
||||||
msgstr "Créer une nouvelle étiquette"
|
msgstr "Créer une nouvelle étiquette"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:425
|
#: src/views/board/index.tsx:426
|
||||||
msgid "Create new list"
|
msgid "Create new list"
|
||||||
msgstr "Créer une nouvelle liste"
|
msgstr "Créer une nouvelle liste"
|
||||||
|
|
||||||
@@ -450,7 +396,7 @@ msgstr "Créer une nouvelle liste"
|
|||||||
msgid "Create workspace"
|
msgid "Create workspace"
|
||||||
msgstr "Créer un espace de travail"
|
msgstr "Créer un espace de travail"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:61
|
#: src/views/card/components/ActivityList.tsx:52
|
||||||
msgid "created the card"
|
msgid "created the card"
|
||||||
msgstr "a créé la carte"
|
msgstr "a créé la carte"
|
||||||
|
|
||||||
@@ -475,10 +421,9 @@ msgid "Dark"
|
|||||||
msgstr "Sombre"
|
msgstr "Sombre"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||||
#: src/components/LabelForm.tsx:228
|
#: src/components/LabelForm.tsx:226
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:51
|
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Supprimer"
|
msgstr "Supprimer"
|
||||||
|
|
||||||
@@ -492,11 +437,11 @@ msgstr "Supprimer le compte"
|
|||||||
msgid "Delete board"
|
msgid "Delete board"
|
||||||
msgstr "Supprimer le tableau"
|
msgstr "Supprimer le tableau"
|
||||||
|
|
||||||
#: src/views/card/components/Dropdown.tsx:25
|
#: src/views/card/components/Dropdown.tsx:14
|
||||||
msgid "Delete card"
|
msgid "Delete card"
|
||||||
msgstr "Supprimer la carte"
|
msgstr "Supprimer la carte"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:91
|
#: src/views/card/components/Comment.tsx:89
|
||||||
msgid "Delete comment"
|
msgid "Delete comment"
|
||||||
msgstr "Supprimer le commentaire"
|
msgstr "Supprimer le commentaire"
|
||||||
|
|
||||||
@@ -510,24 +455,6 @@ msgstr "Supprimer la liste"
|
|||||||
msgid "Delete workspace"
|
msgid "Delete workspace"
|
||||||
msgstr "Supprimer l'espace de travail"
|
msgstr "Supprimer l'espace de travail"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:71
|
|
||||||
msgid "deleted a checklist"
|
|
||||||
msgstr "a supprimé une checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:76
|
|
||||||
msgid "deleted a checklist item"
|
|
||||||
msgstr "a supprimé un élément de la checklist"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:162
|
|
||||||
msgid "deleted checklist <0>{0}</0>"
|
|
||||||
msgstr "a supprimé la checklist <0>{0}</0>"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:205
|
|
||||||
msgid "deleted checklist item <0>{0}</0>"
|
|
||||||
msgstr "a supprimé l'élément <0>{0}</0> de la checklist"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:32
|
#: src/views/boards/components/TemplateBoards.tsx:32
|
||||||
msgid "Design"
|
msgid "Design"
|
||||||
msgstr "Design"
|
msgstr "Design"
|
||||||
@@ -590,11 +517,11 @@ msgstr "Fait"
|
|||||||
msgid "Edit board URL"
|
msgid "Edit board URL"
|
||||||
msgstr "Modifier l'URL du tableau"
|
msgstr "Modifier l'URL du tableau"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:82
|
#: src/views/card/components/Comment.tsx:80
|
||||||
msgid "Edit comment"
|
msgid "Edit comment"
|
||||||
msgstr "Modifier le commentaire"
|
msgstr "Modifier le commentaire"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:119
|
#: src/components/LabelForm.tsx:118
|
||||||
msgid "Edit label"
|
msgid "Edit label"
|
||||||
msgstr "Modifier l'étiquette"
|
msgstr "Modifier l'étiquette"
|
||||||
|
|
||||||
@@ -634,7 +561,7 @@ msgstr "Saisissez votre mot de passe"
|
|||||||
msgid "Error deleting account"
|
msgid "Error deleting account"
|
||||||
msgstr "Erreur lors de la suppression du compte"
|
msgstr "Erreur lors de la suppression du compte"
|
||||||
|
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:25
|
#: src/components/DeleteLabelConfirmation.tsx:22
|
||||||
msgid "Error deleting label"
|
msgid "Error deleting label"
|
||||||
msgstr "Erreur lors de la suppression de l'étiquette"
|
msgstr "Erreur lors de la suppression de l'étiquette"
|
||||||
|
|
||||||
@@ -733,6 +660,7 @@ msgstr "Trouvez des réponses aux questions fréquentes sur le projet. Vous ne t
|
|||||||
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
|
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
|
||||||
msgstr "Pour une durabilité à long terme, nous reconnaissons que tous les bons projets open source ont besoin d'une source de revenus. La nôtre provient de l'offre cloud payante pour les espaces de travail avec plusieurs utilisateurs (gratuite pendant la bêta) et pour les slugs d'espace de travail personnalisés. Il n'y a aucune obligation de l'utiliser, et vous pouvez auto-héberger le logiciel sur votre propre infrastructure gratuitement."
|
msgstr "Pour une durabilité à long terme, nous reconnaissons que tous les bons projets open source ont besoin d'une source de revenus. La nôtre provient de l'offre cloud payante pour les espaces de travail avec plusieurs utilisateurs (gratuite pendant la bêta) et pour les slugs d'espace de travail personnalisés. Il n'y a aucune obligation de l'utiliser, et vous pouvez auto-héberger le logiciel sur votre propre infrastructure gratuitement."
|
||||||
|
|
||||||
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
#: src/views/home/components/Pricing.tsx:32
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Gratuit"
|
msgstr "Gratuit"
|
||||||
@@ -765,7 +693,7 @@ msgstr "Commencer"
|
|||||||
msgid "Get started by creating a new board"
|
msgid "Get started by creating a new board"
|
||||||
msgstr "Commencez par créer un nouveau tableau"
|
msgstr "Commencez par créer un nouveau tableau"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:417
|
#: src/views/board/index.tsx:418
|
||||||
msgid "Get started by creating a new list"
|
msgid "Get started by creating a new list"
|
||||||
msgstr "Commencez par créer une nouvelle liste"
|
msgstr "Commencez par créer une nouvelle liste"
|
||||||
|
|
||||||
@@ -922,8 +850,8 @@ msgstr "Kanban réinventé"
|
|||||||
msgid "Keep in mind that this action is irreversible."
|
msgid "Keep in mind that this action is irreversible."
|
||||||
msgstr "Gardez à l'esprit que cette action est irréversible."
|
msgstr "Gardez à l'esprit que cette action est irréversible."
|
||||||
|
|
||||||
#: src/views/card/index.tsx:118
|
#: src/views/card/index.tsx:113
|
||||||
#: src/views/board/components/NewCardForm.tsx:398
|
#: src/views/board/components/NewCardForm.tsx:358
|
||||||
#: src/views/board/components/Filters.tsx:101
|
#: src/views/board/components/Filters.tsx:101
|
||||||
msgid "Labels"
|
msgid "Labels"
|
||||||
msgstr "Étiquettes"
|
msgstr "Étiquettes"
|
||||||
@@ -956,7 +884,7 @@ msgstr "Clair"
|
|||||||
msgid "Link copied"
|
msgid "Link copied"
|
||||||
msgstr "Lien copié"
|
msgstr "Lien copié"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:110
|
#: src/views/card/index.tsx:105
|
||||||
msgid "List"
|
msgid "List"
|
||||||
msgstr "Liste"
|
msgstr "Liste"
|
||||||
|
|
||||||
@@ -984,22 +912,13 @@ msgstr "Priorité basse"
|
|||||||
msgid "magic link"
|
msgid "magic link"
|
||||||
msgstr "lien magique"
|
msgstr "lien magique"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:75
|
|
||||||
msgid "marked a checklist item as incomplete"
|
|
||||||
msgstr "a marqué un élément de la checklist comme incomplet"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:196
|
|
||||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
|
||||||
msgstr "a marqué l'élément <0>{0}</0> de la checklist comme incomplet"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:17
|
#: src/views/boards/components/TemplateBoards.tsx:17
|
||||||
msgid "Medium Priority"
|
msgid "Medium Priority"
|
||||||
msgstr "Priorité moyenne"
|
msgstr "Priorité moyenne"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:161
|
#: src/views/members/index.tsx:161
|
||||||
#: src/views/card/index.tsx:126
|
#: src/views/card/index.tsx:121
|
||||||
#: src/views/board/components/NewCardForm.tsx:357
|
#: src/views/board/components/NewCardForm.tsx:317
|
||||||
#: src/views/board/components/Filters.tsx:93
|
#: src/views/board/components/Filters.tsx:93
|
||||||
#: src/components/SideNavigation.tsx:73
|
#: src/components/SideNavigation.tsx:73
|
||||||
msgid "Members"
|
msgid "Members"
|
||||||
@@ -1014,18 +933,16 @@ msgstr "Membres | {0}"
|
|||||||
msgid "Monthly"
|
msgid "Monthly"
|
||||||
msgstr "Mensuel"
|
msgstr "Mensuel"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromList)
|
#: src/views/card/components/ActivityList.tsx:81
|
||||||
#. placeholder {1}: truncate(toList)
|
msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||||
#: src/views/card/components/ActivityList.tsx:98
|
msgstr "a déplacé la carte de <0>{fromList}</0> vers<1>{toList}</1>"
|
||||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
|
||||||
msgstr "a déplacé la carte de <0>{0}</0> vers <1>{1}</1>"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:64
|
#: src/views/card/components/ActivityList.tsx:55
|
||||||
msgid "moved the card to another list"
|
msgid "moved the card to another list"
|
||||||
msgstr "a déplacé la carte vers une autre liste"
|
msgstr "a déplacé la carte vers une autre liste"
|
||||||
|
|
||||||
#: src/views/boards/components/NewBoardForm.tsx:99
|
#: src/views/boards/components/NewBoardForm.tsx:99
|
||||||
#: src/components/LabelForm.tsx:135
|
#: src/components/LabelForm.tsx:134
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nom"
|
msgstr "Nom"
|
||||||
|
|
||||||
@@ -1041,23 +958,19 @@ msgstr "Nouveau"
|
|||||||
msgid "New board"
|
msgid "New board"
|
||||||
msgstr "Nouveau tableau"
|
msgstr "Nouveau tableau"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:290
|
#: src/views/board/components/NewCardForm.tsx:261
|
||||||
msgid "New card"
|
msgid "New card"
|
||||||
msgstr "Nouvelle carte"
|
msgstr "Nouvelle carte"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:102
|
|
||||||
msgid "New checklist"
|
|
||||||
msgstr "Nouvelle checklist"
|
|
||||||
|
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
||||||
msgid "New import"
|
msgid "New import"
|
||||||
msgstr "Nouvel import"
|
msgstr "Nouvel import"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:119
|
#: src/components/LabelForm.tsx:118
|
||||||
msgid "New label"
|
msgid "New label"
|
||||||
msgstr "Nouvelle étiquette"
|
msgstr "Nouvelle étiquette"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:394
|
#: src/views/board/index.tsx:395
|
||||||
#: src/views/board/components/NewListForm.tsx:112
|
#: src/views/board/components/NewListForm.tsx:112
|
||||||
msgid "New list"
|
msgid "New list"
|
||||||
msgstr "Nouvelle liste"
|
msgstr "Nouvelle liste"
|
||||||
@@ -1090,7 +1003,7 @@ msgstr "Aucun tableau trouvé"
|
|||||||
msgid "No credit card required"
|
msgid "No credit card required"
|
||||||
msgstr "Aucune carte de crédit requise"
|
msgstr "Aucune carte de crédit requise"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:414
|
#: src/views/board/index.tsx:415
|
||||||
msgid "No lists"
|
msgid "No lists"
|
||||||
msgstr "Aucune liste"
|
msgstr "Aucune liste"
|
||||||
|
|
||||||
@@ -1173,30 +1086,24 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
|
|||||||
#: src/views/settings/components/Avatar.tsx:98
|
#: src/views/settings/components/Avatar.tsx:98
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/card/index.tsx:173
|
#: src/views/card/index.tsx:159
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
|
||||||
#: src/views/card/components/MemberSelector.tsx:80
|
#: src/views/card/components/MemberSelector.tsx:80
|
||||||
#: src/views/card/components/ListSelector.tsx:53
|
#: src/views/card/components/ListSelector.tsx:53
|
||||||
#: src/views/card/components/LabelSelector.tsx:73
|
#: src/views/card/components/LabelSelector.tsx:73
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
||||||
#: src/views/card/components/Comment.tsx:64
|
#: src/views/card/components/Comment.tsx:62
|
||||||
#: src/views/card/components/ChecklistNameInput.tsx:46
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:60
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:88
|
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
||||||
#: src/views/board/index.tsx:134
|
#: src/views/board/index.tsx:135
|
||||||
#: src/views/board/index.tsx:190
|
#: src/views/board/index.tsx:191
|
||||||
#: src/views/board/components/VisibilityButton.tsx:53
|
#: src/views/board/components/VisibilityButton.tsx:53
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||||
#: src/views/board/components/NewListForm.tsx:78
|
#: src/views/board/components/NewListForm.tsx:78
|
||||||
#: src/views/board/components/NewCardForm.tsx:174
|
#: src/views/board/components/NewCardForm.tsx:145
|
||||||
#: src/components/NewWorkspaceForm.tsx:41
|
#: src/components/NewWorkspaceForm.tsx:41
|
||||||
#: src/components/FeedbackModal.tsx:41
|
#: src/components/FeedbackModal.tsx:41
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
#: src/components/DeleteLabelConfirmation.tsx:23
|
||||||
msgid "Please try again later, or contact customer support."
|
msgid "Please try again later, or contact customer support."
|
||||||
msgstr "Veuillez réessayer plus tard ou contacter le service client."
|
msgstr "Veuillez réessayer plus tard ou contacter le service client."
|
||||||
|
|
||||||
@@ -1262,32 +1169,17 @@ msgstr "Supprimer"
|
|||||||
msgid "Remove member"
|
msgid "Remove member"
|
||||||
msgstr "Supprimer le membre"
|
msgstr "Supprimer le membre"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:66
|
#: src/views/card/components/ActivityList.tsx:57
|
||||||
msgid "removed a label from the card"
|
msgid "removed a label from the card"
|
||||||
msgstr "a supprimé une étiquette de la carte"
|
msgstr "a supprimé une étiquette de la carte"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:68
|
#: src/views/card/components/ActivityList.tsx:59
|
||||||
msgid "removed a member from the card"
|
msgid "removed a member from the card"
|
||||||
msgstr "a retiré un membre de la carte"
|
msgstr "a retiré un membre de la carte"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(label)
|
#: src/views/card/components/ActivityList.tsx:118
|
||||||
#: src/views/card/components/ActivityList.tsx:138
|
msgid "removed label <0>{label}</0>"
|
||||||
msgid "removed label <0>{0}</0>"
|
msgstr "a supprimé l'étiquette <0>{label}</0>"
|
||||||
msgstr "a supprimé l'étiquette <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:70
|
|
||||||
msgid "renamed a checklist"
|
|
||||||
msgstr "a renommé une checklist"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:154
|
|
||||||
msgid "renamed checklist <0>{0}</0>"
|
|
||||||
msgstr "a renommé la checklist <0>{0}</0>"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:178
|
|
||||||
msgid "renamed checklist item to <0>{0}</0>"
|
|
||||||
msgstr "a renommé l'élément de la liste de contrôle en <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:76
|
#: src/views/boards/components/TemplateBoards.tsx:76
|
||||||
msgid "Research"
|
msgid "Research"
|
||||||
@@ -1322,7 +1214,7 @@ msgstr "Rôle"
|
|||||||
msgid "Run on your own infrastructure"
|
msgid "Run on your own infrastructure"
|
||||||
msgstr "Exécutez sur votre propre infrastructure"
|
msgstr "Exécutez sur votre propre infrastructure"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:165
|
#: src/views/card/components/Comment.tsx:163
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Enregistrer"
|
msgstr "Enregistrer"
|
||||||
|
|
||||||
@@ -1350,7 +1242,7 @@ msgstr "Auto-hébergement"
|
|||||||
msgid "Self host with Github"
|
msgid "Self host with Github"
|
||||||
msgstr "Auto-hébergement avec Github"
|
msgstr "Auto-hébergement avec Github"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:107
|
#: src/views/card/components/ActivityList.tsx:89
|
||||||
msgid "self-assigned the card"
|
msgid "self-assigned the card"
|
||||||
msgstr "s'est auto-assigné la carte"
|
msgstr "s'est auto-assigné la carte"
|
||||||
|
|
||||||
@@ -1469,13 +1361,12 @@ msgid "They won't be able to access this workspace."
|
|||||||
msgstr "Ils ne pourront plus accéder à cet espace de travail."
|
msgstr "Ils ne pourront plus accéder à cet espace de travail."
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:44
|
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||||
msgid "This action can't be undone."
|
msgid "This action can't be undone."
|
||||||
msgstr "Cette action ne peut pas être annulée."
|
msgstr "Cette action ne peut pas être annulée."
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:146
|
#: src/views/public/board/index.tsx:140
|
||||||
msgid "This board is private or does not exist"
|
msgid "This board is private or does not exist"
|
||||||
msgstr "Ce tableau est privé ou n'existe pas"
|
msgstr "Ce tableau est privé ou n'existe pas"
|
||||||
|
|
||||||
@@ -1520,22 +1411,14 @@ msgstr "Importations Trello"
|
|||||||
msgid "Triaging"
|
msgid "Triaging"
|
||||||
msgstr "Triage"
|
msgstr "Triage"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:88
|
|
||||||
msgid "Unable to add checklist item"
|
|
||||||
msgstr "Impossible d'ajouter l'élément à la liste de contrôle"
|
|
||||||
|
|
||||||
#: src/views/card/components/NewCommentForm.tsx:30
|
#: src/views/card/components/NewCommentForm.tsx:30
|
||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Impossible d'ajouter un commentaire"
|
msgstr "Impossible d'ajouter un commentaire"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:171
|
#: src/views/board/components/NewCardForm.tsx:142
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Impossible de créer la carte"
|
msgstr "Impossible de créer la carte"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:69
|
|
||||||
msgid "Unable to create checklist"
|
|
||||||
msgstr "Impossible de créer la liste de contrôle"
|
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:77
|
#: src/views/board/components/NewListForm.tsx:77
|
||||||
msgid "Unable to create list"
|
msgid "Unable to create list"
|
||||||
msgstr "Impossible de créer une liste"
|
msgstr "Impossible de créer une liste"
|
||||||
@@ -1548,14 +1431,6 @@ msgstr "Impossible de créer l'espace de travail"
|
|||||||
msgid "Unable to delete card"
|
msgid "Unable to delete card"
|
||||||
msgstr "Impossible de supprimer la carte"
|
msgstr "Impossible de supprimer la carte"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
|
|
||||||
msgid "Unable to delete checklist"
|
|
||||||
msgstr "Impossible de supprimer la liste de contrôle"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:87
|
|
||||||
msgid "Unable to delete checklist item"
|
|
||||||
msgstr "Impossible de supprimer l'élément de la liste de contrôle"
|
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
|
||||||
msgid "Unable to delete comment"
|
msgid "Unable to delete comment"
|
||||||
msgstr "Impossible de supprimer le commentaire"
|
msgstr "Impossible de supprimer le commentaire"
|
||||||
@@ -1576,20 +1451,12 @@ msgstr "Impossible de mettre à jour l'URL du tableau"
|
|||||||
msgid "Unable to update board visibility"
|
msgid "Unable to update board visibility"
|
||||||
msgstr "Impossible de mettre à jour la visibilité du tableau"
|
msgstr "Impossible de mettre à jour la visibilité du tableau"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:172
|
#: src/views/card/index.tsx:158
|
||||||
#: src/views/board/index.tsx:189
|
#: src/views/board/index.tsx:190
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Impossible de mettre à jour la carte"
|
msgstr "Impossible de mettre à jour la carte"
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistNameInput.tsx:45
|
#: src/views/card/components/Comment.tsx:61
|
||||||
msgid "Unable to update checklist"
|
|
||||||
msgstr "Impossible de mettre à jour la liste de contrôle"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:59
|
|
||||||
msgid "Unable to update checklist item"
|
|
||||||
msgstr "Impossible de mettre à jour l'élément de la liste de contrôle"
|
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:63
|
|
||||||
msgid "Unable to update comment"
|
msgid "Unable to update comment"
|
||||||
msgstr "Impossible de mettre à jour le commentaire"
|
msgstr "Impossible de mettre à jour le commentaire"
|
||||||
|
|
||||||
@@ -1598,7 +1465,7 @@ msgid "Unable to update labels"
|
|||||||
msgstr "Impossible de mettre à jour les étiquettes"
|
msgstr "Impossible de mettre à jour les étiquettes"
|
||||||
|
|
||||||
#: src/views/card/components/ListSelector.tsx:52
|
#: src/views/card/components/ListSelector.tsx:52
|
||||||
#: src/views/board/index.tsx:133
|
#: src/views/board/index.tsx:134
|
||||||
msgid "Unable to update list"
|
msgid "Unable to update list"
|
||||||
msgstr "Impossible de mettre à jour la liste"
|
msgstr "Impossible de mettre à jour la liste"
|
||||||
|
|
||||||
@@ -1606,12 +1473,11 @@ msgstr "Impossible de mettre à jour la liste"
|
|||||||
msgid "Unable to update members"
|
msgid "Unable to update members"
|
||||||
msgstr "Impossible de mettre à jour les membres"
|
msgstr "Impossible de mettre à jour les membres"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(memberName)
|
#: src/views/card/components/ActivityList.tsx:102
|
||||||
#: src/views/card/components/ActivityList.tsx:121
|
msgid "unassigned <0>{memberName}</0> from the card"
|
||||||
msgid "unassigned <0>{0}</0> from the card"
|
msgstr "a retiré <0>{memberName}</0> de la carte"
|
||||||
msgstr "a désassigné <0>{0}</0> de la carte"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:118
|
#: src/views/card/components/ActivityList.tsx:99
|
||||||
msgid "unassigned themselves from the card"
|
msgid "unassigned themselves from the card"
|
||||||
msgstr "s'est retiré de la carte"
|
msgstr "s'est retiré de la carte"
|
||||||
|
|
||||||
@@ -1647,26 +1513,21 @@ msgstr "Listes illimitées"
|
|||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Mettre à jour"
|
msgstr "Mettre à jour"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:238
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Update label"
|
msgid "Update label"
|
||||||
msgstr "Mettre à jour l'étiquette"
|
msgstr "Mettre à jour l'étiquette"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:73
|
#: src/views/card/components/ActivityList.tsx:54
|
||||||
msgid "updated a checklist item"
|
|
||||||
msgstr "a mis à jour un élément de la liste de contrôle"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:63
|
|
||||||
msgid "updated the description"
|
msgid "updated the description"
|
||||||
msgstr "a mis à jour la description"
|
msgstr "a mis à jour la description"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:62
|
#: src/views/card/components/ActivityList.tsx:53
|
||||||
msgid "updated the title"
|
msgid "updated the title"
|
||||||
msgstr "a mis à jour le titre"
|
msgstr "a mis à jour le titre"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
#: src/views/card/components/ActivityList.tsx:73
|
||||||
#: src/views/card/components/ActivityList.tsx:90
|
msgid "updated the title to <0>{toTitle}</0>"
|
||||||
msgid "updated the title to <0>{0}</0>"
|
msgstr "a mis à jour le titre en <0>{toTitle}</0>"
|
||||||
msgstr "a mis à jour le titre en <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
||||||
msgid "Upgrade"
|
msgid "Upgrade"
|
||||||
@@ -1717,15 +1578,11 @@ msgstr "Consultez et gérez votre facturation et votre abonnement."
|
|||||||
msgid "View docs"
|
msgid "View docs"
|
||||||
msgstr "Voir la documentation"
|
msgstr "Voir la documentation"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:120
|
|
||||||
msgid "View only"
|
|
||||||
msgstr "Affichage uniquement"
|
|
||||||
|
|
||||||
#: src/views/home/components/Features.tsx:147
|
#: src/views/home/components/Features.tsx:147
|
||||||
msgid "View our roadmap."
|
msgid "View our roadmap."
|
||||||
msgstr "Consultez notre feuille de route."
|
msgstr "Consultez notre feuille de route."
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:149
|
#: src/views/public/board/index.tsx:143
|
||||||
msgid "View workspace"
|
msgid "View workspace"
|
||||||
msgstr "Voir l'espace de travail"
|
msgstr "Voir l'espace de travail"
|
||||||
|
|
||||||
@@ -1761,7 +1618,7 @@ msgstr "Quand Trello a été lancé en 2011, il a impressionné tout le monde pa
|
|||||||
msgid "Why make an open source Trello?"
|
msgid "Why make an open source Trello?"
|
||||||
msgstr "Pourquoi créer un Trello open source ?"
|
msgstr "Pourquoi créer un Trello open source ?"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:331
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Workspace"
|
msgid "Workspace"
|
||||||
msgstr "Espace de travail"
|
msgstr "Espace de travail"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Plural-Forms: \n"
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:123
|
#: src/views/card/components/Comment.tsx:121
|
||||||
msgid " (edited)"
|
msgid " (edited)"
|
||||||
msgstr " (modificato)"
|
msgstr " (modificato)"
|
||||||
|
|
||||||
@@ -23,12 +23,12 @@ msgstr ", o consulta i nostri"
|
|||||||
|
|
||||||
#. placeholder {0}: card?.title ?? "Card"
|
#. placeholder {0}: card?.title ?? "Card"
|
||||||
#. placeholder {1}: board?.name ?? "Board"
|
#. placeholder {1}: board?.name ?? "Board"
|
||||||
#: src/views/card/index.tsx:214
|
#: src/views/card/index.tsx:189
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
#. placeholder {0}: labelPublicIds.length
|
#. placeholder {0}: labelPublicIds.length
|
||||||
#: src/views/board/components/NewCardForm.tsx:432
|
#: src/views/board/components/NewCardForm.tsx:392
|
||||||
msgid "{0} labels"
|
msgid "{0} labels"
|
||||||
msgstr "{0} etichette"
|
msgstr "{0} etichette"
|
||||||
|
|
||||||
@@ -48,8 +48,8 @@ msgstr "Un'app kanban potente e flessibile che ti aiuta a organizzare il lavoro,
|
|||||||
msgid "Account deleted"
|
msgid "Account deleted"
|
||||||
msgstr "Account eliminato"
|
msgstr "Account eliminato"
|
||||||
|
|
||||||
#: src/views/public/board/CardModal.tsx:140
|
#: src/views/public/board/CardModal.tsx:104
|
||||||
#: src/views/card/index.tsx:288
|
#: src/views/card/index.tsx:256
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Attività"
|
msgstr "Attività"
|
||||||
|
|
||||||
@@ -62,25 +62,13 @@ msgid "Add a card"
|
|||||||
msgstr "Aggiungi una carta"
|
msgstr "Aggiungi una carta"
|
||||||
|
|
||||||
#: src/views/card/components/NewCommentForm.tsx:57
|
#: src/views/card/components/NewCommentForm.tsx:57
|
||||||
#: src/views/card/components/Comment.tsx:146
|
#: src/views/card/components/Comment.tsx:144
|
||||||
msgid "Add a comment..."
|
msgid "Add a comment..."
|
||||||
msgstr "Aggiungi un commento..."
|
msgstr "Aggiungi un commento..."
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:140
|
#: src/components/Editor.tsx:303
|
||||||
msgid "Add an item..."
|
msgid "Add description... (type '/' to open commands)"
|
||||||
msgstr "Aggiungi un elemento..."
|
msgstr "Aggiungi descrizione... (digita '/' per aprire i comandi)"
|
||||||
|
|
||||||
#: src/views/card/components/Dropdown.tsx:18
|
|
||||||
msgid "Add checklist"
|
|
||||||
msgstr "Aggiungi checklist"
|
|
||||||
|
|
||||||
#: src/components/Editor.tsx:442
|
|
||||||
msgid "Add description... (type '/' to open commands or '@' to mention)"
|
|
||||||
msgstr "Aggiungi descrizione... (digita '/' per aprire i comandi o '@' per menzionare)"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:172
|
|
||||||
msgid "Add details..."
|
|
||||||
msgstr "Aggiungi dettagli..."
|
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:110
|
#: src/views/card/components/LabelSelector.tsx:110
|
||||||
#: src/views/card/components/LabelSelector.tsx:118
|
#: src/views/card/components/LabelSelector.tsx:118
|
||||||
@@ -92,36 +80,17 @@ msgstr "Aggiungi etichetta"
|
|||||||
msgid "Add member"
|
msgid "Add member"
|
||||||
msgstr "Aggiungi membro"
|
msgstr "Aggiungi membro"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:69
|
#: src/views/card/components/ActivityList.tsx:56
|
||||||
msgid "added a checklist"
|
|
||||||
msgstr "ha aggiunto una checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:72
|
|
||||||
msgid "added a checklist item"
|
|
||||||
msgstr "ha aggiunto un elemento alla checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:65
|
|
||||||
msgid "added a label to the card"
|
msgid "added a label to the card"
|
||||||
msgstr "ha aggiunto un'etichetta alla carta"
|
msgstr "ha aggiunto un'etichetta alla carta"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:67
|
#: src/views/card/components/ActivityList.tsx:58
|
||||||
msgid "added a member to the card"
|
msgid "added a member to the card"
|
||||||
msgstr "ha aggiunto un membro alla carta"
|
msgstr "ha aggiunto un membro alla carta"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
#: src/views/card/components/ActivityList.tsx:110
|
||||||
#: src/views/card/components/ActivityList.tsx:146
|
msgid "added label <0>{label}</0>"
|
||||||
msgid "added checklist <0>{0}</0>"
|
msgstr "ha aggiunto l'etichetta <0>{label}</0>"
|
||||||
msgstr "ha aggiunto la checklist <0>{0}</0>"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:170
|
|
||||||
msgid "added checklist item <0>{0}</0>"
|
|
||||||
msgstr "ha aggiunto l'elemento <0>{0}</0> alla checklist"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(label)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:130
|
|
||||||
msgid "added label <0>{0}</0>"
|
|
||||||
msgstr "ha aggiunto l'etichetta <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:55
|
#: src/views/home/components/Pricing.tsx:55
|
||||||
msgid "Admin roles"
|
msgid "Admin roles"
|
||||||
@@ -172,15 +141,11 @@ msgstr "Sei sicuro di voler eliminare lo spazio di lavoro {0}?"
|
|||||||
msgid "Are you sure you want to delete this card?"
|
msgid "Are you sure you want to delete this card?"
|
||||||
msgstr "Sei sicuro di voler eliminare questa carta?"
|
msgstr "Sei sicuro di voler eliminare questa carta?"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
|
|
||||||
msgid "Are you sure you want to delete this checklist?"
|
|
||||||
msgstr "Sei sicuro di voler eliminare questa checklist?"
|
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
|
||||||
msgid "Are you sure you want to delete this comment?"
|
msgid "Are you sure you want to delete this comment?"
|
||||||
msgstr "Sei sicuro di voler eliminare questo commento?"
|
msgstr "Sei sicuro di voler eliminare questo commento?"
|
||||||
|
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:41
|
#: src/components/DeleteLabelConfirmation.tsx:39
|
||||||
msgid "Are you sure you want to delete this label?"
|
msgid "Are you sure you want to delete this label?"
|
||||||
msgstr "Sei sicuro di voler eliminare questa etichetta?"
|
msgstr "Sei sicuro di voler eliminare questa etichetta?"
|
||||||
|
|
||||||
@@ -188,10 +153,9 @@ msgstr "Sei sicuro di voler eliminare questa etichetta?"
|
|||||||
msgid "Are you sure you want to delete your account?"
|
msgid "Are you sure you want to delete your account?"
|
||||||
msgstr "Sei sicuro di voler eliminare il tuo account?"
|
msgstr "Sei sicuro di voler eliminare il tuo account?"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(memberName)
|
#: src/views/card/components/ActivityList.tsx:92
|
||||||
#: src/views/card/components/ActivityList.tsx:110
|
msgid "assigned <0>{memberName}</0> to the card"
|
||||||
msgid "assigned <0>{0}</0> to the card"
|
msgstr "ha assegnato <0>{memberName}</0> alla carta"
|
||||||
msgstr "ha assegnato <0>{0}</0> alla scheda"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:46
|
#: src/views/boards/components/TemplateBoards.tsx:46
|
||||||
msgid "Awaiting Customer"
|
msgid "Awaiting Customer"
|
||||||
@@ -218,7 +182,7 @@ msgstr "Portale di fatturazione"
|
|||||||
msgid "Blog Post"
|
msgid "Blog Post"
|
||||||
msgstr "Post del blog"
|
msgstr "Post del blog"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:331
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Bacheca"
|
msgstr "Bacheca"
|
||||||
|
|
||||||
@@ -230,8 +194,8 @@ msgstr "Il nome della bacheca non può superare i 100 caratteri"
|
|||||||
msgid "Board name is required"
|
msgid "Board name is required"
|
||||||
msgstr "Il nome della bacheca è obbligatorio"
|
msgstr "Il nome della bacheca è obbligatorio"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:143
|
#: src/views/public/board/index.tsx:137
|
||||||
#: src/views/board/index.tsx:357
|
#: src/views/board/index.tsx:358
|
||||||
msgid "Board not found"
|
msgid "Board not found"
|
||||||
msgstr "Bacheca non trovata"
|
msgstr "Bacheca non trovata"
|
||||||
|
|
||||||
@@ -286,18 +250,17 @@ msgstr "Segnalazione bug"
|
|||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
||||||
#: src/views/card/components/Comment.tsx:158
|
#: src/views/card/components/Comment.tsx:156
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:49
|
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annulla"
|
msgstr "Annulla"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:259
|
#: src/views/card/index.tsx:234
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Carta non trovata"
|
msgstr "Carta non trovata"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:307
|
#: src/views/board/components/NewCardForm.tsx:278
|
||||||
msgid "Card title"
|
msgid "Card title"
|
||||||
msgstr "Titolo della carta"
|
msgstr "Titolo della carta"
|
||||||
|
|
||||||
@@ -310,10 +273,6 @@ msgstr "Cambia la lingua dell'app."
|
|||||||
msgid "Check your inbox"
|
msgid "Check your inbox"
|
||||||
msgstr "Controlla la tua casella di posta"
|
msgstr "Controlla la tua casella di posta"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:118
|
|
||||||
msgid "Checklist name"
|
|
||||||
msgstr "Nome della checklist"
|
|
||||||
|
|
||||||
#: src/views/board/components/Filters.tsx:155
|
#: src/views/board/components/Filters.tsx:155
|
||||||
msgid "Clear filters"
|
msgid "Clear filters"
|
||||||
msgstr "Cancella filtri"
|
msgstr "Cancella filtri"
|
||||||
@@ -351,15 +310,6 @@ msgstr "Completato"
|
|||||||
msgid "Complete control and ownership:"
|
msgid "Complete control and ownership:"
|
||||||
msgstr "Controllo e proprietà completi:"
|
msgstr "Controllo e proprietà completi:"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:74
|
|
||||||
msgid "completed a checklist item"
|
|
||||||
msgstr "ha completato un elemento della checklist"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:187
|
|
||||||
msgid "completed checklist item <0>{0}</0>"
|
|
||||||
msgstr "ha completato l'elemento <0>{0}</0> della checklist"
|
|
||||||
|
|
||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:42
|
#: src/views/settings/components/CustomURLConfirmation.tsx:42
|
||||||
msgid "Confirm URL change"
|
msgid "Confirm URL change"
|
||||||
msgstr "Conferma modifica URL"
|
msgstr "Conferma modifica URL"
|
||||||
@@ -403,8 +353,8 @@ msgid "Control who can view and edit your boards."
|
|||||||
msgstr "Controlla chi può visualizzare e modificare le tue bacheche."
|
msgstr "Controlla chi può visualizzare e modificare le tue bacheche."
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:140
|
#: src/views/board/components/NewListForm.tsx:140
|
||||||
#: src/views/board/components/NewCardForm.tsx:458
|
#: src/views/board/components/NewCardForm.tsx:418
|
||||||
#: src/components/LabelForm.tsx:213
|
#: src/components/LabelForm.tsx:212
|
||||||
msgid "Create another"
|
msgid "Create another"
|
||||||
msgstr "Crea un altro"
|
msgstr "Crea un altro"
|
||||||
|
|
||||||
@@ -412,15 +362,11 @@ msgstr "Crea un altro"
|
|||||||
msgid "Create board"
|
msgid "Create board"
|
||||||
msgstr "Crea bacheca"
|
msgstr "Crea bacheca"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:468
|
#: src/views/board/components/NewCardForm.tsx:428
|
||||||
msgid "Create card"
|
msgid "Create card"
|
||||||
msgstr "Crea carta"
|
msgstr "Crea carta"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:134
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Create checklist"
|
|
||||||
msgstr "Crea checklist"
|
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:238
|
|
||||||
msgid "Create label"
|
msgid "Create label"
|
||||||
msgstr "Crea etichetta"
|
msgstr "Crea etichetta"
|
||||||
|
|
||||||
@@ -437,11 +383,11 @@ msgid "Create new key"
|
|||||||
msgstr "Crea nuova chiave"
|
msgstr "Crea nuova chiave"
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:98
|
#: src/views/card/components/LabelSelector.tsx:98
|
||||||
#: src/views/board/components/NewCardForm.tsx:394
|
#: src/views/board/components/NewCardForm.tsx:354
|
||||||
msgid "Create new label"
|
msgid "Create new label"
|
||||||
msgstr "Crea nuova etichetta"
|
msgstr "Crea nuova etichetta"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:425
|
#: src/views/board/index.tsx:426
|
||||||
msgid "Create new list"
|
msgid "Create new list"
|
||||||
msgstr "Crea nuova lista"
|
msgstr "Crea nuova lista"
|
||||||
|
|
||||||
@@ -450,7 +396,7 @@ msgstr "Crea nuova lista"
|
|||||||
msgid "Create workspace"
|
msgid "Create workspace"
|
||||||
msgstr "Crea spazio di lavoro"
|
msgstr "Crea spazio di lavoro"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:61
|
#: src/views/card/components/ActivityList.tsx:52
|
||||||
msgid "created the card"
|
msgid "created the card"
|
||||||
msgstr "ha creato la carta"
|
msgstr "ha creato la carta"
|
||||||
|
|
||||||
@@ -475,10 +421,9 @@ msgid "Dark"
|
|||||||
msgstr "Scuro"
|
msgstr "Scuro"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||||
#: src/components/LabelForm.tsx:228
|
#: src/components/LabelForm.tsx:226
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:51
|
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Elimina"
|
msgstr "Elimina"
|
||||||
|
|
||||||
@@ -492,11 +437,11 @@ msgstr "Elimina account"
|
|||||||
msgid "Delete board"
|
msgid "Delete board"
|
||||||
msgstr "Elimina bacheca"
|
msgstr "Elimina bacheca"
|
||||||
|
|
||||||
#: src/views/card/components/Dropdown.tsx:25
|
#: src/views/card/components/Dropdown.tsx:14
|
||||||
msgid "Delete card"
|
msgid "Delete card"
|
||||||
msgstr "Elimina carta"
|
msgstr "Elimina carta"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:91
|
#: src/views/card/components/Comment.tsx:89
|
||||||
msgid "Delete comment"
|
msgid "Delete comment"
|
||||||
msgstr "Elimina commento"
|
msgstr "Elimina commento"
|
||||||
|
|
||||||
@@ -510,24 +455,6 @@ msgstr "Elimina lista"
|
|||||||
msgid "Delete workspace"
|
msgid "Delete workspace"
|
||||||
msgstr "Elimina spazio di lavoro"
|
msgstr "Elimina spazio di lavoro"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:71
|
|
||||||
msgid "deleted a checklist"
|
|
||||||
msgstr "ha eliminato una checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:76
|
|
||||||
msgid "deleted a checklist item"
|
|
||||||
msgstr "ha eliminato un elemento della checklist"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:162
|
|
||||||
msgid "deleted checklist <0>{0}</0>"
|
|
||||||
msgstr "ha eliminato la checklist <0>{0}</0>"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:205
|
|
||||||
msgid "deleted checklist item <0>{0}</0>"
|
|
||||||
msgstr "ha eliminato l'elemento <0>{0}</0> della checklist"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:32
|
#: src/views/boards/components/TemplateBoards.tsx:32
|
||||||
msgid "Design"
|
msgid "Design"
|
||||||
msgstr "Design"
|
msgstr "Design"
|
||||||
@@ -590,11 +517,11 @@ msgstr "Fatto"
|
|||||||
msgid "Edit board URL"
|
msgid "Edit board URL"
|
||||||
msgstr "Modifica URL della bacheca"
|
msgstr "Modifica URL della bacheca"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:82
|
#: src/views/card/components/Comment.tsx:80
|
||||||
msgid "Edit comment"
|
msgid "Edit comment"
|
||||||
msgstr "Modifica commento"
|
msgstr "Modifica commento"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:119
|
#: src/components/LabelForm.tsx:118
|
||||||
msgid "Edit label"
|
msgid "Edit label"
|
||||||
msgstr "Modifica etichetta"
|
msgstr "Modifica etichetta"
|
||||||
|
|
||||||
@@ -634,7 +561,7 @@ msgstr "Inserisci la tua password"
|
|||||||
msgid "Error deleting account"
|
msgid "Error deleting account"
|
||||||
msgstr "Errore durante l'eliminazione dell'account"
|
msgstr "Errore durante l'eliminazione dell'account"
|
||||||
|
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:25
|
#: src/components/DeleteLabelConfirmation.tsx:22
|
||||||
msgid "Error deleting label"
|
msgid "Error deleting label"
|
||||||
msgstr "Errore durante l'eliminazione dell'etichetta"
|
msgstr "Errore durante l'eliminazione dell'etichetta"
|
||||||
|
|
||||||
@@ -733,6 +660,7 @@ msgstr "Trova risposte alle domande comuni sul progetto. Non trovi quello che st
|
|||||||
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
|
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
|
||||||
msgstr "Per la sostenibilità a lungo termine, riconosciamo che tutti i buoni progetti open source necessitano di una fonte di entrate. La nostra proviene dall'offerta cloud a pagamento per workspace con più utenti (gratuita durante la beta) e per slug di workspace personalizzati. Non c'è alcun obbligo di utilizzarla, e puoi ospitare autonomamente il software sulla tua infrastruttura gratuitamente."
|
msgstr "Per la sostenibilità a lungo termine, riconosciamo che tutti i buoni progetti open source necessitano di una fonte di entrate. La nostra proviene dall'offerta cloud a pagamento per workspace con più utenti (gratuita durante la beta) e per slug di workspace personalizzati. Non c'è alcun obbligo di utilizzarla, e puoi ospitare autonomamente il software sulla tua infrastruttura gratuitamente."
|
||||||
|
|
||||||
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
#: src/views/home/components/Pricing.tsx:32
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Gratuito"
|
msgstr "Gratuito"
|
||||||
@@ -765,7 +693,7 @@ msgstr "Inizia ora"
|
|||||||
msgid "Get started by creating a new board"
|
msgid "Get started by creating a new board"
|
||||||
msgstr "Inizia creando una nuova bacheca"
|
msgstr "Inizia creando una nuova bacheca"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:417
|
#: src/views/board/index.tsx:418
|
||||||
msgid "Get started by creating a new list"
|
msgid "Get started by creating a new list"
|
||||||
msgstr "Inizia creando una nuova lista"
|
msgstr "Inizia creando una nuova lista"
|
||||||
|
|
||||||
@@ -922,8 +850,8 @@ msgstr "Kanban reinventato"
|
|||||||
msgid "Keep in mind that this action is irreversible."
|
msgid "Keep in mind that this action is irreversible."
|
||||||
msgstr "Tieni presente che questa azione è irreversibile."
|
msgstr "Tieni presente che questa azione è irreversibile."
|
||||||
|
|
||||||
#: src/views/card/index.tsx:118
|
#: src/views/card/index.tsx:113
|
||||||
#: src/views/board/components/NewCardForm.tsx:398
|
#: src/views/board/components/NewCardForm.tsx:358
|
||||||
#: src/views/board/components/Filters.tsx:101
|
#: src/views/board/components/Filters.tsx:101
|
||||||
msgid "Labels"
|
msgid "Labels"
|
||||||
msgstr "Etichette"
|
msgstr "Etichette"
|
||||||
@@ -956,7 +884,7 @@ msgstr "Chiaro"
|
|||||||
msgid "Link copied"
|
msgid "Link copied"
|
||||||
msgstr "Link copiato"
|
msgstr "Link copiato"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:110
|
#: src/views/card/index.tsx:105
|
||||||
msgid "List"
|
msgid "List"
|
||||||
msgstr "Lista"
|
msgstr "Lista"
|
||||||
|
|
||||||
@@ -984,22 +912,13 @@ msgstr "Bassa priorità"
|
|||||||
msgid "magic link"
|
msgid "magic link"
|
||||||
msgstr "link magico"
|
msgstr "link magico"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:75
|
|
||||||
msgid "marked a checklist item as incomplete"
|
|
||||||
msgstr "ha segnato un elemento della checklist come incompleto"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:196
|
|
||||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
|
||||||
msgstr "ha segnato l'elemento <0>{0}</0> della checklist come incompleto"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:17
|
#: src/views/boards/components/TemplateBoards.tsx:17
|
||||||
msgid "Medium Priority"
|
msgid "Medium Priority"
|
||||||
msgstr "Media priorità"
|
msgstr "Media priorità"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:161
|
#: src/views/members/index.tsx:161
|
||||||
#: src/views/card/index.tsx:126
|
#: src/views/card/index.tsx:121
|
||||||
#: src/views/board/components/NewCardForm.tsx:357
|
#: src/views/board/components/NewCardForm.tsx:317
|
||||||
#: src/views/board/components/Filters.tsx:93
|
#: src/views/board/components/Filters.tsx:93
|
||||||
#: src/components/SideNavigation.tsx:73
|
#: src/components/SideNavigation.tsx:73
|
||||||
msgid "Members"
|
msgid "Members"
|
||||||
@@ -1014,18 +933,16 @@ msgstr "Membri | {0}"
|
|||||||
msgid "Monthly"
|
msgid "Monthly"
|
||||||
msgstr "Mensile"
|
msgstr "Mensile"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromList)
|
#: src/views/card/components/ActivityList.tsx:81
|
||||||
#. placeholder {1}: truncate(toList)
|
msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||||
#: src/views/card/components/ActivityList.tsx:98
|
msgstr "ha spostato la scheda da <0>{fromList}</0> a<1>{toList}</1>"
|
||||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
|
||||||
msgstr "ha spostato la scheda da <0>{0}</0> a<1>{1}</1>"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:64
|
#: src/views/card/components/ActivityList.tsx:55
|
||||||
msgid "moved the card to another list"
|
msgid "moved the card to another list"
|
||||||
msgstr "ha spostato la scheda in un'altra lista"
|
msgstr "ha spostato la scheda in un'altra lista"
|
||||||
|
|
||||||
#: src/views/boards/components/NewBoardForm.tsx:99
|
#: src/views/boards/components/NewBoardForm.tsx:99
|
||||||
#: src/components/LabelForm.tsx:135
|
#: src/components/LabelForm.tsx:134
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nome"
|
msgstr "Nome"
|
||||||
|
|
||||||
@@ -1041,23 +958,19 @@ msgstr "Nuovo"
|
|||||||
msgid "New board"
|
msgid "New board"
|
||||||
msgstr "Nuova bacheca"
|
msgstr "Nuova bacheca"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:290
|
#: src/views/board/components/NewCardForm.tsx:261
|
||||||
msgid "New card"
|
msgid "New card"
|
||||||
msgstr "Nuova carta"
|
msgstr "Nuova carta"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:102
|
|
||||||
msgid "New checklist"
|
|
||||||
msgstr "Nuova checklist"
|
|
||||||
|
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
||||||
msgid "New import"
|
msgid "New import"
|
||||||
msgstr "Nuova importazione"
|
msgstr "Nuova importazione"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:119
|
#: src/components/LabelForm.tsx:118
|
||||||
msgid "New label"
|
msgid "New label"
|
||||||
msgstr "Nuova etichetta"
|
msgstr "Nuova etichetta"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:394
|
#: src/views/board/index.tsx:395
|
||||||
#: src/views/board/components/NewListForm.tsx:112
|
#: src/views/board/components/NewListForm.tsx:112
|
||||||
msgid "New list"
|
msgid "New list"
|
||||||
msgstr "Nuova lista"
|
msgstr "Nuova lista"
|
||||||
@@ -1090,7 +1003,7 @@ msgstr "Nessuna bacheca trovata"
|
|||||||
msgid "No credit card required"
|
msgid "No credit card required"
|
||||||
msgstr "Nessuna carta di credito richiesta"
|
msgstr "Nessuna carta di credito richiesta"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:414
|
#: src/views/board/index.tsx:415
|
||||||
msgid "No lists"
|
msgid "No lists"
|
||||||
msgstr "Nessuna lista"
|
msgstr "Nessuna lista"
|
||||||
|
|
||||||
@@ -1173,30 +1086,24 @@ msgstr "Seleziona un file da caricare."
|
|||||||
#: src/views/settings/components/Avatar.tsx:98
|
#: src/views/settings/components/Avatar.tsx:98
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/card/index.tsx:173
|
#: src/views/card/index.tsx:159
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
|
||||||
#: src/views/card/components/MemberSelector.tsx:80
|
#: src/views/card/components/MemberSelector.tsx:80
|
||||||
#: src/views/card/components/ListSelector.tsx:53
|
#: src/views/card/components/ListSelector.tsx:53
|
||||||
#: src/views/card/components/LabelSelector.tsx:73
|
#: src/views/card/components/LabelSelector.tsx:73
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
||||||
#: src/views/card/components/Comment.tsx:64
|
#: src/views/card/components/Comment.tsx:62
|
||||||
#: src/views/card/components/ChecklistNameInput.tsx:46
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:60
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:88
|
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
||||||
#: src/views/board/index.tsx:134
|
#: src/views/board/index.tsx:135
|
||||||
#: src/views/board/index.tsx:190
|
#: src/views/board/index.tsx:191
|
||||||
#: src/views/board/components/VisibilityButton.tsx:53
|
#: src/views/board/components/VisibilityButton.tsx:53
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||||
#: src/views/board/components/NewListForm.tsx:78
|
#: src/views/board/components/NewListForm.tsx:78
|
||||||
#: src/views/board/components/NewCardForm.tsx:174
|
#: src/views/board/components/NewCardForm.tsx:145
|
||||||
#: src/components/NewWorkspaceForm.tsx:41
|
#: src/components/NewWorkspaceForm.tsx:41
|
||||||
#: src/components/FeedbackModal.tsx:41
|
#: src/components/FeedbackModal.tsx:41
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
#: src/components/DeleteLabelConfirmation.tsx:23
|
||||||
msgid "Please try again later, or contact customer support."
|
msgid "Please try again later, or contact customer support."
|
||||||
msgstr "Riprova più tardi o contatta l'assistenza clienti."
|
msgstr "Riprova più tardi o contatta l'assistenza clienti."
|
||||||
|
|
||||||
@@ -1262,32 +1169,17 @@ msgstr "Rimuovi"
|
|||||||
msgid "Remove member"
|
msgid "Remove member"
|
||||||
msgstr "Rimuovi membro"
|
msgstr "Rimuovi membro"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:66
|
#: src/views/card/components/ActivityList.tsx:57
|
||||||
msgid "removed a label from the card"
|
msgid "removed a label from the card"
|
||||||
msgstr "ha rimosso un'etichetta dalla scheda"
|
msgstr "ha rimosso un'etichetta dalla scheda"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:68
|
#: src/views/card/components/ActivityList.tsx:59
|
||||||
msgid "removed a member from the card"
|
msgid "removed a member from the card"
|
||||||
msgstr "ha rimosso un membro dalla scheda"
|
msgstr "ha rimosso un membro dalla scheda"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(label)
|
#: src/views/card/components/ActivityList.tsx:118
|
||||||
#: src/views/card/components/ActivityList.tsx:138
|
msgid "removed label <0>{label}</0>"
|
||||||
msgid "removed label <0>{0}</0>"
|
msgstr "ha rimosso l'etichetta <0>{label}</0>"
|
||||||
msgstr "ha rimosso l'etichetta <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:70
|
|
||||||
msgid "renamed a checklist"
|
|
||||||
msgstr "ha rinominato una checklist"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:154
|
|
||||||
msgid "renamed checklist <0>{0}</0>"
|
|
||||||
msgstr "ha rinominato la checklist <0>{0}</0>"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:178
|
|
||||||
msgid "renamed checklist item to <0>{0}</0>"
|
|
||||||
msgstr "ha rinominato l'elemento della checklist in <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:76
|
#: src/views/boards/components/TemplateBoards.tsx:76
|
||||||
msgid "Research"
|
msgid "Research"
|
||||||
@@ -1322,7 +1214,7 @@ msgstr "Ruolo"
|
|||||||
msgid "Run on your own infrastructure"
|
msgid "Run on your own infrastructure"
|
||||||
msgstr "Esegui sulla tua infrastruttura"
|
msgstr "Esegui sulla tua infrastruttura"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:165
|
#: src/views/card/components/Comment.tsx:163
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Salva"
|
msgstr "Salva"
|
||||||
|
|
||||||
@@ -1350,7 +1242,7 @@ msgstr "Self Host"
|
|||||||
msgid "Self host with Github"
|
msgid "Self host with Github"
|
||||||
msgstr "Self host con Github"
|
msgstr "Self host con Github"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:107
|
#: src/views/card/components/ActivityList.tsx:89
|
||||||
msgid "self-assigned the card"
|
msgid "self-assigned the card"
|
||||||
msgstr "si è auto-assegnato la scheda"
|
msgstr "si è auto-assegnato la scheda"
|
||||||
|
|
||||||
@@ -1469,13 +1361,12 @@ msgid "They won't be able to access this workspace."
|
|||||||
msgstr "Non potranno accedere a questo spazio di lavoro."
|
msgstr "Non potranno accedere a questo spazio di lavoro."
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:44
|
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||||
msgid "This action can't be undone."
|
msgid "This action can't be undone."
|
||||||
msgstr "Questa azione non può essere annullata."
|
msgstr "Questa azione non può essere annullata."
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:146
|
#: src/views/public/board/index.tsx:140
|
||||||
msgid "This board is private or does not exist"
|
msgid "This board is private or does not exist"
|
||||||
msgstr "Questa bacheca è privata o non esiste"
|
msgstr "Questa bacheca è privata o non esiste"
|
||||||
|
|
||||||
@@ -1520,22 +1411,14 @@ msgstr "Importazioni da Trello"
|
|||||||
msgid "Triaging"
|
msgid "Triaging"
|
||||||
msgstr "Smistamento"
|
msgstr "Smistamento"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:88
|
|
||||||
msgid "Unable to add checklist item"
|
|
||||||
msgstr "Impossibile aggiungere l'elemento della checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/NewCommentForm.tsx:30
|
#: src/views/card/components/NewCommentForm.tsx:30
|
||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Impossibile aggiungere il commento"
|
msgstr "Impossibile aggiungere il commento"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:171
|
#: src/views/board/components/NewCardForm.tsx:142
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Impossibile creare la scheda"
|
msgstr "Impossibile creare la scheda"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:69
|
|
||||||
msgid "Unable to create checklist"
|
|
||||||
msgstr "Impossibile creare la checklist"
|
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:77
|
#: src/views/board/components/NewListForm.tsx:77
|
||||||
msgid "Unable to create list"
|
msgid "Unable to create list"
|
||||||
msgstr "Impossibile creare la lista"
|
msgstr "Impossibile creare la lista"
|
||||||
@@ -1548,14 +1431,6 @@ msgstr "Impossibile creare lo spazio di lavoro"
|
|||||||
msgid "Unable to delete card"
|
msgid "Unable to delete card"
|
||||||
msgstr "Impossibile eliminare la scheda"
|
msgstr "Impossibile eliminare la scheda"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
|
|
||||||
msgid "Unable to delete checklist"
|
|
||||||
msgstr "Impossibile eliminare la checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:87
|
|
||||||
msgid "Unable to delete checklist item"
|
|
||||||
msgstr "Impossibile eliminare l'elemento della checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
|
||||||
msgid "Unable to delete comment"
|
msgid "Unable to delete comment"
|
||||||
msgstr "Impossibile eliminare il commento"
|
msgstr "Impossibile eliminare il commento"
|
||||||
@@ -1576,20 +1451,12 @@ msgstr "Impossibile aggiornare l'URL della bacheca"
|
|||||||
msgid "Unable to update board visibility"
|
msgid "Unable to update board visibility"
|
||||||
msgstr "Impossibile aggiornare la visibilità della bacheca"
|
msgstr "Impossibile aggiornare la visibilità della bacheca"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:172
|
#: src/views/card/index.tsx:158
|
||||||
#: src/views/board/index.tsx:189
|
#: src/views/board/index.tsx:190
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Impossibile aggiornare la scheda"
|
msgstr "Impossibile aggiornare la scheda"
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistNameInput.tsx:45
|
#: src/views/card/components/Comment.tsx:61
|
||||||
msgid "Unable to update checklist"
|
|
||||||
msgstr "Impossibile aggiornare la checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:59
|
|
||||||
msgid "Unable to update checklist item"
|
|
||||||
msgstr "Impossibile aggiornare l'elemento della checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:63
|
|
||||||
msgid "Unable to update comment"
|
msgid "Unable to update comment"
|
||||||
msgstr "Impossibile aggiornare il commento"
|
msgstr "Impossibile aggiornare il commento"
|
||||||
|
|
||||||
@@ -1598,7 +1465,7 @@ msgid "Unable to update labels"
|
|||||||
msgstr "Impossibile aggiornare le etichette"
|
msgstr "Impossibile aggiornare le etichette"
|
||||||
|
|
||||||
#: src/views/card/components/ListSelector.tsx:52
|
#: src/views/card/components/ListSelector.tsx:52
|
||||||
#: src/views/board/index.tsx:133
|
#: src/views/board/index.tsx:134
|
||||||
msgid "Unable to update list"
|
msgid "Unable to update list"
|
||||||
msgstr "Impossibile aggiornare la lista"
|
msgstr "Impossibile aggiornare la lista"
|
||||||
|
|
||||||
@@ -1606,12 +1473,11 @@ msgstr "Impossibile aggiornare la lista"
|
|||||||
msgid "Unable to update members"
|
msgid "Unable to update members"
|
||||||
msgstr "Impossibile aggiornare i membri"
|
msgstr "Impossibile aggiornare i membri"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(memberName)
|
#: src/views/card/components/ActivityList.tsx:102
|
||||||
#: src/views/card/components/ActivityList.tsx:121
|
msgid "unassigned <0>{memberName}</0> from the card"
|
||||||
msgid "unassigned <0>{0}</0> from the card"
|
msgstr "ha rimosso l'assegnazione di <0>{memberName}</0> dalla scheda"
|
||||||
msgstr "ha rimosso l'assegnazione di <0>{0}</0> dalla scheda"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:118
|
#: src/views/card/components/ActivityList.tsx:99
|
||||||
msgid "unassigned themselves from the card"
|
msgid "unassigned themselves from the card"
|
||||||
msgstr "si è rimosso dall'assegnazione della scheda"
|
msgstr "si è rimosso dall'assegnazione della scheda"
|
||||||
|
|
||||||
@@ -1647,26 +1513,21 @@ msgstr "Liste illimitate"
|
|||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Aggiorna"
|
msgstr "Aggiorna"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:238
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Update label"
|
msgid "Update label"
|
||||||
msgstr "Aggiorna etichetta"
|
msgstr "Aggiorna etichetta"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:73
|
#: src/views/card/components/ActivityList.tsx:54
|
||||||
msgid "updated a checklist item"
|
|
||||||
msgstr "ha aggiornato un elemento della checklist"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:63
|
|
||||||
msgid "updated the description"
|
msgid "updated the description"
|
||||||
msgstr "ha aggiornato la descrizione"
|
msgstr "ha aggiornato la descrizione"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:62
|
#: src/views/card/components/ActivityList.tsx:53
|
||||||
msgid "updated the title"
|
msgid "updated the title"
|
||||||
msgstr "ha aggiornato il titolo"
|
msgstr "ha aggiornato il titolo"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
#: src/views/card/components/ActivityList.tsx:73
|
||||||
#: src/views/card/components/ActivityList.tsx:90
|
msgid "updated the title to <0>{toTitle}</0>"
|
||||||
msgid "updated the title to <0>{0}</0>"
|
msgstr "ha aggiornato il titolo in <0>{toTitle}</0>"
|
||||||
msgstr "ha aggiornato il titolo in <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
||||||
msgid "Upgrade"
|
msgid "Upgrade"
|
||||||
@@ -1717,15 +1578,11 @@ msgstr "Visualizza e gestisci la tua fatturazione e abbonamento."
|
|||||||
msgid "View docs"
|
msgid "View docs"
|
||||||
msgstr "Visualizza documenti"
|
msgstr "Visualizza documenti"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:120
|
|
||||||
msgid "View only"
|
|
||||||
msgstr "Solo visualizzazione"
|
|
||||||
|
|
||||||
#: src/views/home/components/Features.tsx:147
|
#: src/views/home/components/Features.tsx:147
|
||||||
msgid "View our roadmap."
|
msgid "View our roadmap."
|
||||||
msgstr "Visualizza la nostra roadmap."
|
msgstr "Visualizza la nostra roadmap."
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:149
|
#: src/views/public/board/index.tsx:143
|
||||||
msgid "View workspace"
|
msgid "View workspace"
|
||||||
msgstr "Visualizza spazio di lavoro"
|
msgstr "Visualizza spazio di lavoro"
|
||||||
|
|
||||||
@@ -1761,7 +1618,7 @@ msgstr "Quando Trello fu lanciato nel 2011, stupì tutti con la sua semplicità
|
|||||||
msgid "Why make an open source Trello?"
|
msgid "Why make an open source Trello?"
|
||||||
msgstr "Perché creare un Trello open source?"
|
msgstr "Perché creare un Trello open source?"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:331
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Workspace"
|
msgid "Workspace"
|
||||||
msgstr "Spazio di lavoro"
|
msgstr "Spazio di lavoro"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Plural-Forms: \n"
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:123
|
#: src/views/card/components/Comment.tsx:121
|
||||||
msgid " (edited)"
|
msgid " (edited)"
|
||||||
msgstr " (bewerkt)"
|
msgstr " (bewerkt)"
|
||||||
|
|
||||||
@@ -23,12 +23,12 @@ msgstr ", of bekijk onze"
|
|||||||
|
|
||||||
#. placeholder {0}: card?.title ?? "Card"
|
#. placeholder {0}: card?.title ?? "Card"
|
||||||
#. placeholder {1}: board?.name ?? "Board"
|
#. placeholder {1}: board?.name ?? "Board"
|
||||||
#: src/views/card/index.tsx:214
|
#: src/views/card/index.tsx:189
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
#. placeholder {0}: labelPublicIds.length
|
#. placeholder {0}: labelPublicIds.length
|
||||||
#: src/views/board/components/NewCardForm.tsx:432
|
#: src/views/board/components/NewCardForm.tsx:392
|
||||||
msgid "{0} labels"
|
msgid "{0} labels"
|
||||||
msgstr "{0} labels"
|
msgstr "{0} labels"
|
||||||
|
|
||||||
@@ -48,8 +48,8 @@ msgstr "Een krachtige, flexibele kanban-app die je helpt werk te organiseren, vo
|
|||||||
msgid "Account deleted"
|
msgid "Account deleted"
|
||||||
msgstr "Account verwijderd"
|
msgstr "Account verwijderd"
|
||||||
|
|
||||||
#: src/views/public/board/CardModal.tsx:140
|
#: src/views/public/board/CardModal.tsx:104
|
||||||
#: src/views/card/index.tsx:288
|
#: src/views/card/index.tsx:256
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Activiteit"
|
msgstr "Activiteit"
|
||||||
|
|
||||||
@@ -62,25 +62,13 @@ msgid "Add a card"
|
|||||||
msgstr "Voeg een kaart toe"
|
msgstr "Voeg een kaart toe"
|
||||||
|
|
||||||
#: src/views/card/components/NewCommentForm.tsx:57
|
#: src/views/card/components/NewCommentForm.tsx:57
|
||||||
#: src/views/card/components/Comment.tsx:146
|
#: src/views/card/components/Comment.tsx:144
|
||||||
msgid "Add a comment..."
|
msgid "Add a comment..."
|
||||||
msgstr "Voeg een reactie toe..."
|
msgstr "Voeg een reactie toe..."
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:140
|
#: src/components/Editor.tsx:303
|
||||||
msgid "Add an item..."
|
msgid "Add description... (type '/' to open commands)"
|
||||||
msgstr "Voeg een item toe..."
|
msgstr "Voeg beschrijving toe... (typ '/' om commando's te openen)"
|
||||||
|
|
||||||
#: src/views/card/components/Dropdown.tsx:18
|
|
||||||
msgid "Add checklist"
|
|
||||||
msgstr "Checklist toevoegen"
|
|
||||||
|
|
||||||
#: src/components/Editor.tsx:442
|
|
||||||
msgid "Add description... (type '/' to open commands or '@' to mention)"
|
|
||||||
msgstr "Beschrijving toevoegen... (typ '/' om commando's te openen of '@' om te vermelden)"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:172
|
|
||||||
msgid "Add details..."
|
|
||||||
msgstr "Details toevoegen..."
|
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:110
|
#: src/views/card/components/LabelSelector.tsx:110
|
||||||
#: src/views/card/components/LabelSelector.tsx:118
|
#: src/views/card/components/LabelSelector.tsx:118
|
||||||
@@ -92,36 +80,17 @@ msgstr "Label toevoegen"
|
|||||||
msgid "Add member"
|
msgid "Add member"
|
||||||
msgstr "Lid toevoegen"
|
msgstr "Lid toevoegen"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:69
|
#: src/views/card/components/ActivityList.tsx:56
|
||||||
msgid "added a checklist"
|
|
||||||
msgstr "heeft een checklist toegevoegd"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:72
|
|
||||||
msgid "added a checklist item"
|
|
||||||
msgstr "heeft een checklistitem toegevoegd"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:65
|
|
||||||
msgid "added a label to the card"
|
msgid "added a label to the card"
|
||||||
msgstr "heeft een label aan de kaart toegevoegd"
|
msgstr "heeft een label aan de kaart toegevoegd"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:67
|
#: src/views/card/components/ActivityList.tsx:58
|
||||||
msgid "added a member to the card"
|
msgid "added a member to the card"
|
||||||
msgstr "heeft een lid aan de kaart toegevoegd"
|
msgstr "heeft een lid aan de kaart toegevoegd"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
#: src/views/card/components/ActivityList.tsx:110
|
||||||
#: src/views/card/components/ActivityList.tsx:146
|
msgid "added label <0>{label}</0>"
|
||||||
msgid "added checklist <0>{0}</0>"
|
msgstr "heeft label <0>{label}</0> toegevoegd"
|
||||||
msgstr "heeft checklist <0>{0}</0> toegevoegd"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:170
|
|
||||||
msgid "added checklist item <0>{0}</0>"
|
|
||||||
msgstr "heeft checklistitem <0>{0}</0> toegevoegd"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(label)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:130
|
|
||||||
msgid "added label <0>{0}</0>"
|
|
||||||
msgstr "heeft label <0>{0}</0> toegevoegd"
|
|
||||||
|
|
||||||
#: src/views/home/components/Pricing.tsx:55
|
#: src/views/home/components/Pricing.tsx:55
|
||||||
msgid "Admin roles"
|
msgid "Admin roles"
|
||||||
@@ -172,15 +141,11 @@ msgstr "Weet je zeker dat je de werkruimte {0} wilt verwijderen?"
|
|||||||
msgid "Are you sure you want to delete this card?"
|
msgid "Are you sure you want to delete this card?"
|
||||||
msgstr "Weet je zeker dat je deze kaart wilt verwijderen?"
|
msgstr "Weet je zeker dat je deze kaart wilt verwijderen?"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
|
|
||||||
msgid "Are you sure you want to delete this checklist?"
|
|
||||||
msgstr "Weet je zeker dat je deze checklist wilt verwijderen?"
|
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
|
||||||
msgid "Are you sure you want to delete this comment?"
|
msgid "Are you sure you want to delete this comment?"
|
||||||
msgstr "Weet je zeker dat je deze opmerking wilt verwijderen?"
|
msgstr "Weet je zeker dat je deze opmerking wilt verwijderen?"
|
||||||
|
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:41
|
#: src/components/DeleteLabelConfirmation.tsx:39
|
||||||
msgid "Are you sure you want to delete this label?"
|
msgid "Are you sure you want to delete this label?"
|
||||||
msgstr "Weet je zeker dat je dit label wilt verwijderen?"
|
msgstr "Weet je zeker dat je dit label wilt verwijderen?"
|
||||||
|
|
||||||
@@ -188,10 +153,9 @@ msgstr "Weet je zeker dat je dit label wilt verwijderen?"
|
|||||||
msgid "Are you sure you want to delete your account?"
|
msgid "Are you sure you want to delete your account?"
|
||||||
msgstr "Weet je zeker dat je je account wilt verwijderen?"
|
msgstr "Weet je zeker dat je je account wilt verwijderen?"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(memberName)
|
#: src/views/card/components/ActivityList.tsx:92
|
||||||
#: src/views/card/components/ActivityList.tsx:110
|
msgid "assigned <0>{memberName}</0> to the card"
|
||||||
msgid "assigned <0>{0}</0> to the card"
|
msgstr "heeft <0>{memberName}</0> aan de kaart toegewezen"
|
||||||
msgstr "heeft <0>{0}</0> aan de kaart toegewezen"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:46
|
#: src/views/boards/components/TemplateBoards.tsx:46
|
||||||
msgid "Awaiting Customer"
|
msgid "Awaiting Customer"
|
||||||
@@ -218,7 +182,7 @@ msgstr "Factureringsportaal"
|
|||||||
msgid "Blog Post"
|
msgid "Blog Post"
|
||||||
msgstr "Blogbericht"
|
msgstr "Blogbericht"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:331
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Bord"
|
msgstr "Bord"
|
||||||
|
|
||||||
@@ -230,8 +194,8 @@ msgstr "Bordnaam mag niet langer zijn dan 100 tekens"
|
|||||||
msgid "Board name is required"
|
msgid "Board name is required"
|
||||||
msgstr "Bordnaam is verplicht"
|
msgstr "Bordnaam is verplicht"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:143
|
#: src/views/public/board/index.tsx:137
|
||||||
#: src/views/board/index.tsx:357
|
#: src/views/board/index.tsx:358
|
||||||
msgid "Board not found"
|
msgid "Board not found"
|
||||||
msgstr "Bord niet gevonden"
|
msgstr "Bord niet gevonden"
|
||||||
|
|
||||||
@@ -286,18 +250,17 @@ msgstr "Bugrapport"
|
|||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
#: src/views/card/components/DeleteCardConfirmation.tsx:86
|
||||||
#: src/views/card/components/Comment.tsx:158
|
#: src/views/card/components/Comment.tsx:156
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:49
|
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuleren"
|
msgstr "Annuleren"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:259
|
#: src/views/card/index.tsx:234
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Kaart niet gevonden"
|
msgstr "Kaart niet gevonden"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:307
|
#: src/views/board/components/NewCardForm.tsx:278
|
||||||
msgid "Card title"
|
msgid "Card title"
|
||||||
msgstr "Kaarttitel"
|
msgstr "Kaarttitel"
|
||||||
|
|
||||||
@@ -310,10 +273,6 @@ msgstr "Wijzig de taal van de app."
|
|||||||
msgid "Check your inbox"
|
msgid "Check your inbox"
|
||||||
msgstr "Controleer je inbox"
|
msgstr "Controleer je inbox"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:118
|
|
||||||
msgid "Checklist name"
|
|
||||||
msgstr "Naam checklist"
|
|
||||||
|
|
||||||
#: src/views/board/components/Filters.tsx:155
|
#: src/views/board/components/Filters.tsx:155
|
||||||
msgid "Clear filters"
|
msgid "Clear filters"
|
||||||
msgstr "Filters wissen"
|
msgstr "Filters wissen"
|
||||||
@@ -351,15 +310,6 @@ msgstr "Voltooid"
|
|||||||
msgid "Complete control and ownership:"
|
msgid "Complete control and ownership:"
|
||||||
msgstr "Volledige controle en eigendom:"
|
msgstr "Volledige controle en eigendom:"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:74
|
|
||||||
msgid "completed a checklist item"
|
|
||||||
msgstr "heeft een checklistitem voltooid"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:187
|
|
||||||
msgid "completed checklist item <0>{0}</0>"
|
|
||||||
msgstr "heeft checklistitem <0>{0}</0> voltooid"
|
|
||||||
|
|
||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:42
|
#: src/views/settings/components/CustomURLConfirmation.tsx:42
|
||||||
msgid "Confirm URL change"
|
msgid "Confirm URL change"
|
||||||
msgstr "URL-wijziging bevestigen"
|
msgstr "URL-wijziging bevestigen"
|
||||||
@@ -403,8 +353,8 @@ msgid "Control who can view and edit your boards."
|
|||||||
msgstr "Bepaal wie je borden kan bekijken en bewerken."
|
msgstr "Bepaal wie je borden kan bekijken en bewerken."
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:140
|
#: src/views/board/components/NewListForm.tsx:140
|
||||||
#: src/views/board/components/NewCardForm.tsx:458
|
#: src/views/board/components/NewCardForm.tsx:418
|
||||||
#: src/components/LabelForm.tsx:213
|
#: src/components/LabelForm.tsx:212
|
||||||
msgid "Create another"
|
msgid "Create another"
|
||||||
msgstr "Maak nog een"
|
msgstr "Maak nog een"
|
||||||
|
|
||||||
@@ -412,15 +362,11 @@ msgstr "Maak nog een"
|
|||||||
msgid "Create board"
|
msgid "Create board"
|
||||||
msgstr "Maak bord"
|
msgstr "Maak bord"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:468
|
#: src/views/board/components/NewCardForm.tsx:428
|
||||||
msgid "Create card"
|
msgid "Create card"
|
||||||
msgstr "Maak kaart"
|
msgstr "Maak kaart"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:134
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Create checklist"
|
|
||||||
msgstr "Checklist maken"
|
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:238
|
|
||||||
msgid "Create label"
|
msgid "Create label"
|
||||||
msgstr "Maak label"
|
msgstr "Maak label"
|
||||||
|
|
||||||
@@ -437,11 +383,11 @@ msgid "Create new key"
|
|||||||
msgstr "Nieuwe sleutel aanmaken"
|
msgstr "Nieuwe sleutel aanmaken"
|
||||||
|
|
||||||
#: src/views/card/components/LabelSelector.tsx:98
|
#: src/views/card/components/LabelSelector.tsx:98
|
||||||
#: src/views/board/components/NewCardForm.tsx:394
|
#: src/views/board/components/NewCardForm.tsx:354
|
||||||
msgid "Create new label"
|
msgid "Create new label"
|
||||||
msgstr "Maak nieuw label"
|
msgstr "Maak nieuw label"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:425
|
#: src/views/board/index.tsx:426
|
||||||
msgid "Create new list"
|
msgid "Create new list"
|
||||||
msgstr "Maak nieuwe lijst"
|
msgstr "Maak nieuwe lijst"
|
||||||
|
|
||||||
@@ -450,7 +396,7 @@ msgstr "Maak nieuwe lijst"
|
|||||||
msgid "Create workspace"
|
msgid "Create workspace"
|
||||||
msgstr "Werkruimte maken"
|
msgstr "Werkruimte maken"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:61
|
#: src/views/card/components/ActivityList.tsx:52
|
||||||
msgid "created the card"
|
msgid "created the card"
|
||||||
msgstr "heeft de kaart aangemaakt"
|
msgstr "heeft de kaart aangemaakt"
|
||||||
|
|
||||||
@@ -475,10 +421,9 @@ msgid "Dark"
|
|||||||
msgstr "Donker"
|
msgstr "Donker"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||||
#: src/components/LabelForm.tsx:228
|
#: src/components/LabelForm.tsx:226
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:51
|
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Verwijderen"
|
msgstr "Verwijderen"
|
||||||
|
|
||||||
@@ -492,11 +437,11 @@ msgstr "Account verwijderen"
|
|||||||
msgid "Delete board"
|
msgid "Delete board"
|
||||||
msgstr "Board verwijderen"
|
msgstr "Board verwijderen"
|
||||||
|
|
||||||
#: src/views/card/components/Dropdown.tsx:25
|
#: src/views/card/components/Dropdown.tsx:14
|
||||||
msgid "Delete card"
|
msgid "Delete card"
|
||||||
msgstr "Kaart verwijderen"
|
msgstr "Kaart verwijderen"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:91
|
#: src/views/card/components/Comment.tsx:89
|
||||||
msgid "Delete comment"
|
msgid "Delete comment"
|
||||||
msgstr "Reactie verwijderen"
|
msgstr "Reactie verwijderen"
|
||||||
|
|
||||||
@@ -510,24 +455,6 @@ msgstr "Lijst verwijderen"
|
|||||||
msgid "Delete workspace"
|
msgid "Delete workspace"
|
||||||
msgstr "Werkruimte verwijderen"
|
msgstr "Werkruimte verwijderen"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:71
|
|
||||||
msgid "deleted a checklist"
|
|
||||||
msgstr "heeft een checklist verwijderd"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:76
|
|
||||||
msgid "deleted a checklist item"
|
|
||||||
msgstr "heeft een checklistitem verwijderd"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:162
|
|
||||||
msgid "deleted checklist <0>{0}</0>"
|
|
||||||
msgstr "heeft checklist <0>{0}</0> verwijderd"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:205
|
|
||||||
msgid "deleted checklist item <0>{0}</0>"
|
|
||||||
msgstr "heeft checklistitem <0>{0}</0> verwijderd"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:32
|
#: src/views/boards/components/TemplateBoards.tsx:32
|
||||||
msgid "Design"
|
msgid "Design"
|
||||||
msgstr "Ontwerp"
|
msgstr "Ontwerp"
|
||||||
@@ -590,11 +517,11 @@ msgstr "Klaar"
|
|||||||
msgid "Edit board URL"
|
msgid "Edit board URL"
|
||||||
msgstr "Board URL bewerken"
|
msgstr "Board URL bewerken"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:82
|
#: src/views/card/components/Comment.tsx:80
|
||||||
msgid "Edit comment"
|
msgid "Edit comment"
|
||||||
msgstr "Reactie bewerken"
|
msgstr "Reactie bewerken"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:119
|
#: src/components/LabelForm.tsx:118
|
||||||
msgid "Edit label"
|
msgid "Edit label"
|
||||||
msgstr "Label bewerken"
|
msgstr "Label bewerken"
|
||||||
|
|
||||||
@@ -634,7 +561,7 @@ msgstr "Voer je wachtwoord in"
|
|||||||
msgid "Error deleting account"
|
msgid "Error deleting account"
|
||||||
msgstr "Fout bij verwijderen account"
|
msgstr "Fout bij verwijderen account"
|
||||||
|
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:25
|
#: src/components/DeleteLabelConfirmation.tsx:22
|
||||||
msgid "Error deleting label"
|
msgid "Error deleting label"
|
||||||
msgstr "Fout bij het verwijderen van label"
|
msgstr "Fout bij het verwijderen van label"
|
||||||
|
|
||||||
@@ -733,6 +660,7 @@ msgstr "Vind antwoorden op veelgestelde vragen over het project. Kun je niet vin
|
|||||||
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
|
msgid "For long-term sustainability, we recognise all good open source projects need a source of revenue. Ours comes from the paid cloud offering for workspaces with multiple users (free during the beta) and for custom workspace slugs. There's no obligation to use it, and you can self-host the software on your own infrastructure free of charge."
|
||||||
msgstr "Voor duurzaamheid op lange termijn erkennen we dat alle goede open source projecten een inkomstenbron nodig hebben. De onze komt van de betaalde cloudoplossing voor werkruimtes met meerdere gebruikers (gratis tijdens de bèta) en voor aangepaste werkruimte-slugs. Je bent niet verplicht om hiervan gebruik te maken en je kunt de software gratis op je eigen infrastructuur hosten."
|
msgstr "Voor duurzaamheid op lange termijn erkennen we dat alle goede open source projecten een inkomstenbron nodig hebben. De onze komt van de betaalde cloudoplossing voor werkruimtes met meerdere gebruikers (gratis tijdens de bèta) en voor aangepaste werkruimte-slugs. Je bent niet verplicht om hiervan gebruik te maken en je kunt de software gratis op je eigen infrastructuur hosten."
|
||||||
|
|
||||||
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
#: src/views/home/components/Pricing.tsx:32
|
#: src/views/home/components/Pricing.tsx:32
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Gratis"
|
msgstr "Gratis"
|
||||||
@@ -765,7 +693,7 @@ msgstr "Aan de slag"
|
|||||||
msgid "Get started by creating a new board"
|
msgid "Get started by creating a new board"
|
||||||
msgstr "Begin door een nieuw bord te maken"
|
msgstr "Begin door een nieuw bord te maken"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:417
|
#: src/views/board/index.tsx:418
|
||||||
msgid "Get started by creating a new list"
|
msgid "Get started by creating a new list"
|
||||||
msgstr "Begin door een nieuwe lijst te maken"
|
msgstr "Begin door een nieuwe lijst te maken"
|
||||||
|
|
||||||
@@ -922,8 +850,8 @@ msgstr "Kanban opnieuw uitgevonden"
|
|||||||
msgid "Keep in mind that this action is irreversible."
|
msgid "Keep in mind that this action is irreversible."
|
||||||
msgstr "Houd er rekening mee dat deze actie onomkeerbaar is."
|
msgstr "Houd er rekening mee dat deze actie onomkeerbaar is."
|
||||||
|
|
||||||
#: src/views/card/index.tsx:118
|
#: src/views/card/index.tsx:113
|
||||||
#: src/views/board/components/NewCardForm.tsx:398
|
#: src/views/board/components/NewCardForm.tsx:358
|
||||||
#: src/views/board/components/Filters.tsx:101
|
#: src/views/board/components/Filters.tsx:101
|
||||||
msgid "Labels"
|
msgid "Labels"
|
||||||
msgstr "Labels"
|
msgstr "Labels"
|
||||||
@@ -956,7 +884,7 @@ msgstr "Licht"
|
|||||||
msgid "Link copied"
|
msgid "Link copied"
|
||||||
msgstr "Link gekopieerd"
|
msgstr "Link gekopieerd"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:110
|
#: src/views/card/index.tsx:105
|
||||||
msgid "List"
|
msgid "List"
|
||||||
msgstr "Lijst"
|
msgstr "Lijst"
|
||||||
|
|
||||||
@@ -984,22 +912,13 @@ msgstr "Lage prioriteit"
|
|||||||
msgid "magic link"
|
msgid "magic link"
|
||||||
msgstr "magische link"
|
msgstr "magische link"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:75
|
|
||||||
msgid "marked a checklist item as incomplete"
|
|
||||||
msgstr "heeft een checklistitem als onvoltooid gemarkeerd"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:196
|
|
||||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
|
||||||
msgstr "heeft checklistitem <0>{0}</0> als onvoltooid gemarkeerd"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:17
|
#: src/views/boards/components/TemplateBoards.tsx:17
|
||||||
msgid "Medium Priority"
|
msgid "Medium Priority"
|
||||||
msgstr "Gemiddelde prioriteit"
|
msgstr "Gemiddelde prioriteit"
|
||||||
|
|
||||||
#: src/views/members/index.tsx:161
|
#: src/views/members/index.tsx:161
|
||||||
#: src/views/card/index.tsx:126
|
#: src/views/card/index.tsx:121
|
||||||
#: src/views/board/components/NewCardForm.tsx:357
|
#: src/views/board/components/NewCardForm.tsx:317
|
||||||
#: src/views/board/components/Filters.tsx:93
|
#: src/views/board/components/Filters.tsx:93
|
||||||
#: src/components/SideNavigation.tsx:73
|
#: src/components/SideNavigation.tsx:73
|
||||||
msgid "Members"
|
msgid "Members"
|
||||||
@@ -1014,18 +933,16 @@ msgstr "Leden | {0}"
|
|||||||
msgid "Monthly"
|
msgid "Monthly"
|
||||||
msgstr "Maandelijks"
|
msgstr "Maandelijks"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(fromList)
|
#: src/views/card/components/ActivityList.tsx:81
|
||||||
#. placeholder {1}: truncate(toList)
|
msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||||
#: src/views/card/components/ActivityList.tsx:98
|
msgstr "heeft de kaart verplaatst van <0>{fromList}</0> naar<1>{toList}</1>"
|
||||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
|
||||||
msgstr "heeft de kaart verplaatst van <0>{0}</0> naar<1>{1}</1>"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:64
|
#: src/views/card/components/ActivityList.tsx:55
|
||||||
msgid "moved the card to another list"
|
msgid "moved the card to another list"
|
||||||
msgstr "heeft de kaart naar een andere lijst verplaatst"
|
msgstr "heeft de kaart naar een andere lijst verplaatst"
|
||||||
|
|
||||||
#: src/views/boards/components/NewBoardForm.tsx:99
|
#: src/views/boards/components/NewBoardForm.tsx:99
|
||||||
#: src/components/LabelForm.tsx:135
|
#: src/components/LabelForm.tsx:134
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Naam"
|
msgstr "Naam"
|
||||||
|
|
||||||
@@ -1041,23 +958,19 @@ msgstr "Nieuw"
|
|||||||
msgid "New board"
|
msgid "New board"
|
||||||
msgstr "Nieuw bord"
|
msgstr "Nieuw bord"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:290
|
#: src/views/board/components/NewCardForm.tsx:261
|
||||||
msgid "New card"
|
msgid "New card"
|
||||||
msgstr "Nieuwe kaart"
|
msgstr "Nieuwe kaart"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:102
|
|
||||||
msgid "New checklist"
|
|
||||||
msgstr "Nieuwe checklist"
|
|
||||||
|
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
||||||
msgid "New import"
|
msgid "New import"
|
||||||
msgstr "Nieuwe import"
|
msgstr "Nieuwe import"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:119
|
#: src/components/LabelForm.tsx:118
|
||||||
msgid "New label"
|
msgid "New label"
|
||||||
msgstr "Nieuw label"
|
msgstr "Nieuw label"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:394
|
#: src/views/board/index.tsx:395
|
||||||
#: src/views/board/components/NewListForm.tsx:112
|
#: src/views/board/components/NewListForm.tsx:112
|
||||||
msgid "New list"
|
msgid "New list"
|
||||||
msgstr "Nieuwe lijst"
|
msgstr "Nieuwe lijst"
|
||||||
@@ -1090,7 +1003,7 @@ msgstr "Geen borden gevonden"
|
|||||||
msgid "No credit card required"
|
msgid "No credit card required"
|
||||||
msgstr "Geen creditcard vereist"
|
msgstr "Geen creditcard vereist"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:414
|
#: src/views/board/index.tsx:415
|
||||||
msgid "No lists"
|
msgid "No lists"
|
||||||
msgstr "Geen lijsten"
|
msgstr "Geen lijsten"
|
||||||
|
|
||||||
@@ -1173,30 +1086,24 @@ msgstr "Selecteer een bestand om te uploaden."
|
|||||||
#: src/views/settings/components/Avatar.tsx:98
|
#: src/views/settings/components/Avatar.tsx:98
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/card/index.tsx:173
|
#: src/views/card/index.tsx:159
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
|
||||||
#: src/views/card/components/MemberSelector.tsx:80
|
#: src/views/card/components/MemberSelector.tsx:80
|
||||||
#: src/views/card/components/ListSelector.tsx:53
|
#: src/views/card/components/ListSelector.tsx:53
|
||||||
#: src/views/card/components/LabelSelector.tsx:73
|
#: src/views/card/components/LabelSelector.tsx:73
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
#: src/views/card/components/DeleteCardConfirmation.tsx:52
|
||||||
#: src/views/card/components/Comment.tsx:64
|
#: src/views/card/components/Comment.tsx:62
|
||||||
#: src/views/card/components/ChecklistNameInput.tsx:46
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:60
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:88
|
|
||||||
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
||||||
#: src/views/board/index.tsx:134
|
#: src/views/board/index.tsx:135
|
||||||
#: src/views/board/index.tsx:190
|
#: src/views/board/index.tsx:191
|
||||||
#: src/views/board/components/VisibilityButton.tsx:53
|
#: src/views/board/components/VisibilityButton.tsx:53
|
||||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||||
#: src/views/board/components/NewListForm.tsx:78
|
#: src/views/board/components/NewListForm.tsx:78
|
||||||
#: src/views/board/components/NewCardForm.tsx:174
|
#: src/views/board/components/NewCardForm.tsx:145
|
||||||
#: src/components/NewWorkspaceForm.tsx:41
|
#: src/components/NewWorkspaceForm.tsx:41
|
||||||
#: src/components/FeedbackModal.tsx:41
|
#: src/components/FeedbackModal.tsx:41
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
#: src/components/DeleteLabelConfirmation.tsx:23
|
||||||
msgid "Please try again later, or contact customer support."
|
msgid "Please try again later, or contact customer support."
|
||||||
msgstr "Probeer het later opnieuw of neem contact op met de klantenservice."
|
msgstr "Probeer het later opnieuw of neem contact op met de klantenservice."
|
||||||
|
|
||||||
@@ -1262,32 +1169,17 @@ msgstr "Verwijderen"
|
|||||||
msgid "Remove member"
|
msgid "Remove member"
|
||||||
msgstr "Lid verwijderen"
|
msgstr "Lid verwijderen"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:66
|
#: src/views/card/components/ActivityList.tsx:57
|
||||||
msgid "removed a label from the card"
|
msgid "removed a label from the card"
|
||||||
msgstr "heeft een label van de kaart verwijderd"
|
msgstr "heeft een label van de kaart verwijderd"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:68
|
#: src/views/card/components/ActivityList.tsx:59
|
||||||
msgid "removed a member from the card"
|
msgid "removed a member from the card"
|
||||||
msgstr "heeft een lid van de kaart verwijderd"
|
msgstr "heeft een lid van de kaart verwijderd"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(label)
|
#: src/views/card/components/ActivityList.tsx:118
|
||||||
#: src/views/card/components/ActivityList.tsx:138
|
msgid "removed label <0>{label}</0>"
|
||||||
msgid "removed label <0>{0}</0>"
|
msgstr "heeft label <0>{label}</0> verwijderd"
|
||||||
msgstr "heeft label <0>{0}</0> verwijderd"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:70
|
|
||||||
msgid "renamed a checklist"
|
|
||||||
msgstr "heeft een checklist hernoemd"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:154
|
|
||||||
msgid "renamed checklist <0>{0}</0>"
|
|
||||||
msgstr "heeft checklist <0>{0}</0> hernoemd"
|
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
|
||||||
#: src/views/card/components/ActivityList.tsx:178
|
|
||||||
msgid "renamed checklist item to <0>{0}</0>"
|
|
||||||
msgstr "checklistitem hernoemd naar <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/boards/components/TemplateBoards.tsx:76
|
#: src/views/boards/components/TemplateBoards.tsx:76
|
||||||
msgid "Research"
|
msgid "Research"
|
||||||
@@ -1322,7 +1214,7 @@ msgstr "Rol"
|
|||||||
msgid "Run on your own infrastructure"
|
msgid "Run on your own infrastructure"
|
||||||
msgstr "Draai op je eigen infrastructuur"
|
msgstr "Draai op je eigen infrastructuur"
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:165
|
#: src/views/card/components/Comment.tsx:163
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Opslaan"
|
msgstr "Opslaan"
|
||||||
|
|
||||||
@@ -1350,7 +1242,7 @@ msgstr "Zelf hosten"
|
|||||||
msgid "Self host with Github"
|
msgid "Self host with Github"
|
||||||
msgstr "Zelf hosten met Github"
|
msgstr "Zelf hosten met Github"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:107
|
#: src/views/card/components/ActivityList.tsx:89
|
||||||
msgid "self-assigned the card"
|
msgid "self-assigned the card"
|
||||||
msgstr "heeft de kaart aan zichzelf toegewezen"
|
msgstr "heeft de kaart aan zichzelf toegewezen"
|
||||||
|
|
||||||
@@ -1469,13 +1361,12 @@ msgid "They won't be able to access this workspace."
|
|||||||
msgstr "Ze zullen geen toegang meer hebben tot deze werkruimte."
|
msgstr "Ze zullen geen toegang meer hebben tot deze werkruimte."
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
|
|
||||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||||
#: src/components/DeleteLabelConfirmation.tsx:44
|
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||||
msgid "This action can't be undone."
|
msgid "This action can't be undone."
|
||||||
msgstr "Deze actie kan niet ongedaan worden gemaakt."
|
msgstr "Deze actie kan niet ongedaan worden gemaakt."
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:146
|
#: src/views/public/board/index.tsx:140
|
||||||
msgid "This board is private or does not exist"
|
msgid "This board is private or does not exist"
|
||||||
msgstr "Dit bord is privé of bestaat niet"
|
msgstr "Dit bord is privé of bestaat niet"
|
||||||
|
|
||||||
@@ -1520,22 +1411,14 @@ msgstr "Trello-imports"
|
|||||||
msgid "Triaging"
|
msgid "Triaging"
|
||||||
msgstr "Triage"
|
msgstr "Triage"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:88
|
|
||||||
msgid "Unable to add checklist item"
|
|
||||||
msgstr "Kan checklistitem niet toevoegen"
|
|
||||||
|
|
||||||
#: src/views/card/components/NewCommentForm.tsx:30
|
#: src/views/card/components/NewCommentForm.tsx:30
|
||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Kan geen reactie toevoegen"
|
msgstr "Kan geen reactie toevoegen"
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:171
|
#: src/views/board/components/NewCardForm.tsx:142
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Kan kaart niet aanmaken"
|
msgstr "Kan kaart niet aanmaken"
|
||||||
|
|
||||||
#: src/views/card/components/NewChecklistForm.tsx:69
|
|
||||||
msgid "Unable to create checklist"
|
|
||||||
msgstr "Kan checklist niet maken"
|
|
||||||
|
|
||||||
#: src/views/board/components/NewListForm.tsx:77
|
#: src/views/board/components/NewListForm.tsx:77
|
||||||
msgid "Unable to create list"
|
msgid "Unable to create list"
|
||||||
msgstr "Kan geen lijst maken"
|
msgstr "Kan geen lijst maken"
|
||||||
@@ -1548,14 +1431,6 @@ msgstr "Kan werkruimte niet aanmaken"
|
|||||||
msgid "Unable to delete card"
|
msgid "Unable to delete card"
|
||||||
msgstr "Kan kaart niet verwijderen"
|
msgstr "Kan kaart niet verwijderen"
|
||||||
|
|
||||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
|
|
||||||
msgid "Unable to delete checklist"
|
|
||||||
msgstr "Kan checklist niet verwijderen"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:87
|
|
||||||
msgid "Unable to delete checklist item"
|
|
||||||
msgstr "Kan checklistitem niet verwijderen"
|
|
||||||
|
|
||||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
|
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
|
||||||
msgid "Unable to delete comment"
|
msgid "Unable to delete comment"
|
||||||
msgstr "Kan opmerking niet verwijderen"
|
msgstr "Kan opmerking niet verwijderen"
|
||||||
@@ -1576,20 +1451,12 @@ msgstr "Kan board URL niet bijwerken"
|
|||||||
msgid "Unable to update board visibility"
|
msgid "Unable to update board visibility"
|
||||||
msgstr "Kan bordzichtbaarheid niet bijwerken"
|
msgstr "Kan bordzichtbaarheid niet bijwerken"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:172
|
#: src/views/card/index.tsx:158
|
||||||
#: src/views/board/index.tsx:189
|
#: src/views/board/index.tsx:190
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Kan kaart niet bijwerken"
|
msgstr "Kan kaart niet bijwerken"
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistNameInput.tsx:45
|
#: src/views/card/components/Comment.tsx:61
|
||||||
msgid "Unable to update checklist"
|
|
||||||
msgstr "Kan checklist niet bijwerken"
|
|
||||||
|
|
||||||
#: src/views/card/components/ChecklistItemRow.tsx:59
|
|
||||||
msgid "Unable to update checklist item"
|
|
||||||
msgstr "Kan checklistitem niet bijwerken"
|
|
||||||
|
|
||||||
#: src/views/card/components/Comment.tsx:63
|
|
||||||
msgid "Unable to update comment"
|
msgid "Unable to update comment"
|
||||||
msgstr "Kan reactie niet bijwerken"
|
msgstr "Kan reactie niet bijwerken"
|
||||||
|
|
||||||
@@ -1598,7 +1465,7 @@ msgid "Unable to update labels"
|
|||||||
msgstr "Kan labels niet bijwerken"
|
msgstr "Kan labels niet bijwerken"
|
||||||
|
|
||||||
#: src/views/card/components/ListSelector.tsx:52
|
#: src/views/card/components/ListSelector.tsx:52
|
||||||
#: src/views/board/index.tsx:133
|
#: src/views/board/index.tsx:134
|
||||||
msgid "Unable to update list"
|
msgid "Unable to update list"
|
||||||
msgstr "Kan lijst niet bijwerken"
|
msgstr "Kan lijst niet bijwerken"
|
||||||
|
|
||||||
@@ -1606,12 +1473,11 @@ msgstr "Kan lijst niet bijwerken"
|
|||||||
msgid "Unable to update members"
|
msgid "Unable to update members"
|
||||||
msgstr "Kan leden niet bijwerken"
|
msgstr "Kan leden niet bijwerken"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(memberName)
|
#: src/views/card/components/ActivityList.tsx:102
|
||||||
#: src/views/card/components/ActivityList.tsx:121
|
msgid "unassigned <0>{memberName}</0> from the card"
|
||||||
msgid "unassigned <0>{0}</0> from the card"
|
msgstr "<0>{memberName}</0> van de kaart verwijderd"
|
||||||
msgstr "<0>{0}</0> van de kaart verwijderd"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:118
|
#: src/views/card/components/ActivityList.tsx:99
|
||||||
msgid "unassigned themselves from the card"
|
msgid "unassigned themselves from the card"
|
||||||
msgstr "zichzelf van de kaart verwijderd"
|
msgstr "zichzelf van de kaart verwijderd"
|
||||||
|
|
||||||
@@ -1647,26 +1513,21 @@ msgstr "Onbeperkt aantal lijsten"
|
|||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Bijwerken"
|
msgstr "Bijwerken"
|
||||||
|
|
||||||
#: src/components/LabelForm.tsx:238
|
#: src/components/LabelForm.tsx:236
|
||||||
msgid "Update label"
|
msgid "Update label"
|
||||||
msgstr "Label bijwerken"
|
msgstr "Label bijwerken"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:73
|
#: src/views/card/components/ActivityList.tsx:54
|
||||||
msgid "updated a checklist item"
|
|
||||||
msgstr "een checklistitem bijgewerkt"
|
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:63
|
|
||||||
msgid "updated the description"
|
msgid "updated the description"
|
||||||
msgstr "beschrijving bijgewerkt"
|
msgstr "beschrijving bijgewerkt"
|
||||||
|
|
||||||
#: src/views/card/components/ActivityList.tsx:62
|
#: src/views/card/components/ActivityList.tsx:53
|
||||||
msgid "updated the title"
|
msgid "updated the title"
|
||||||
msgstr "titel bijgewerkt"
|
msgstr "titel bijgewerkt"
|
||||||
|
|
||||||
#. placeholder {0}: truncate(toTitle)
|
#: src/views/card/components/ActivityList.tsx:73
|
||||||
#: src/views/card/components/ActivityList.tsx:90
|
msgid "updated the title to <0>{toTitle}</0>"
|
||||||
msgid "updated the title to <0>{0}</0>"
|
msgstr "titel bijgewerkt naar <0>{toTitle}</0>"
|
||||||
msgstr "titel bijgewerkt naar <0>{0}</0>"
|
|
||||||
|
|
||||||
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
||||||
msgid "Upgrade"
|
msgid "Upgrade"
|
||||||
@@ -1717,15 +1578,11 @@ msgstr "Bekijk en beheer je facturering en abonnement."
|
|||||||
msgid "View docs"
|
msgid "View docs"
|
||||||
msgstr "Bekijk documentatie"
|
msgstr "Bekijk documentatie"
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:120
|
|
||||||
msgid "View only"
|
|
||||||
msgstr "Alleen bekijken"
|
|
||||||
|
|
||||||
#: src/views/home/components/Features.tsx:147
|
#: src/views/home/components/Features.tsx:147
|
||||||
msgid "View our roadmap."
|
msgid "View our roadmap."
|
||||||
msgstr "Bekijk onze roadmap."
|
msgstr "Bekijk onze roadmap."
|
||||||
|
|
||||||
#: src/views/public/board/index.tsx:149
|
#: src/views/public/board/index.tsx:143
|
||||||
msgid "View workspace"
|
msgid "View workspace"
|
||||||
msgstr "Werkruimte bekijken"
|
msgstr "Werkruimte bekijken"
|
||||||
|
|
||||||
@@ -1761,7 +1618,7 @@ msgstr "Toen Trello in 2011 werd gelanceerd, blies het iedereen omver met zijn z
|
|||||||
msgid "Why make an open source Trello?"
|
msgid "Why make an open source Trello?"
|
||||||
msgstr "Waarom een open source Trello maken?"
|
msgstr "Waarom een open source Trello maken?"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:331
|
#: src/views/board/index.tsx:332
|
||||||
msgid "Workspace"
|
msgid "Workspace"
|
||||||
msgstr "Werkruimte"
|
msgstr "Werkruimte"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -10,7 +10,7 @@ interface Props {
|
|||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ModalContextType {
|
type ModalContextType = {
|
||||||
isOpen: boolean;
|
isOpen: boolean;
|
||||||
openModal: (
|
openModal: (
|
||||||
contentType: string,
|
contentType: string,
|
||||||
@@ -18,8 +18,6 @@ interface ModalContextType {
|
|||||||
entityLabel?: string,
|
entityLabel?: string,
|
||||||
) => void;
|
) => void;
|
||||||
closeModal: () => void;
|
closeModal: () => void;
|
||||||
closeModals: (count: number) => void;
|
|
||||||
clearAllModals: () => void;
|
|
||||||
modalContentType: string;
|
modalContentType: string;
|
||||||
entityId: string;
|
entityId: string;
|
||||||
entityLabel: string;
|
entityLabel: string;
|
||||||
@@ -28,7 +26,7 @@ interface ModalContextType {
|
|||||||
getModalState: (modalType: string) => any;
|
getModalState: (modalType: string) => any;
|
||||||
clearModalState: (modalType: string) => void;
|
clearModalState: (modalType: string) => void;
|
||||||
clearAllModalStates: () => void;
|
clearAllModalStates: () => void;
|
||||||
}
|
};
|
||||||
|
|
||||||
const ModalContext = createContext<ModalContextType | undefined>(undefined);
|
const ModalContext = createContext<ModalContextType | undefined>(undefined);
|
||||||
|
|
||||||
@@ -48,11 +46,11 @@ export const ModalProvider: React.FC<Props> = ({ children }) => {
|
|||||||
entityLabel?: string,
|
entityLabel?: string,
|
||||||
) => {
|
) => {
|
||||||
const newModal: ModalState = { contentType, entityId, entityLabel };
|
const newModal: ModalState = { contentType, entityId, entityLabel };
|
||||||
setModalStack((prev) => [...prev, newModal]);
|
setModalStack(prev => [...prev, newModal]);
|
||||||
};
|
};
|
||||||
|
|
||||||
const closeModal = () => {
|
const closeModal = () => {
|
||||||
setModalStack((prev) => {
|
setModalStack(prev => {
|
||||||
if (prev.length <= 1) {
|
if (prev.length <= 1) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
@@ -60,21 +58,10 @@ export const ModalProvider: React.FC<Props> = ({ children }) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const closeModals = (count: number) => {
|
|
||||||
setModalStack(prev => {
|
|
||||||
const newLength = Math.max(0, prev.length - count);
|
|
||||||
return prev.slice(0, newLength);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const clearAllModals = () => {
|
|
||||||
setModalStack([]);
|
|
||||||
};
|
|
||||||
|
|
||||||
const setModalState = (modalType: string, state: any) => {
|
const setModalState = (modalType: string, state: any) => {
|
||||||
setModalStates((prev) => ({
|
setModalStates(prev => ({
|
||||||
...prev,
|
...prev,
|
||||||
[modalType]: state,
|
[modalType]: state
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -83,7 +70,7 @@ export const ModalProvider: React.FC<Props> = ({ children }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const clearModalState = (modalType: string) => {
|
const clearModalState = (modalType: string) => {
|
||||||
setModalStates((prev) => {
|
setModalStates(prev => {
|
||||||
const newStates = { ...prev };
|
const newStates = { ...prev };
|
||||||
delete newStates[modalType];
|
delete newStates[modalType];
|
||||||
return newStates;
|
return newStates;
|
||||||
@@ -100,8 +87,6 @@ export const ModalProvider: React.FC<Props> = ({ children }) => {
|
|||||||
isOpen,
|
isOpen,
|
||||||
openModal,
|
openModal,
|
||||||
closeModal,
|
closeModal,
|
||||||
closeModals,
|
|
||||||
clearAllModals,
|
|
||||||
modalContentType,
|
modalContentType,
|
||||||
entityId,
|
entityId,
|
||||||
entityLabel,
|
entityLabel,
|
||||||
|
|||||||
@@ -45,9 +45,7 @@ export const formatMemberDisplayName = (
|
|||||||
return localPart.replace(/[_-]/g, ".");
|
return localPart.replace(/[_-]/g, ".");
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getAvatarUrl = (imageOrKey: string | null) => {
|
export const getAvatarUrl = (imageOrKey: string) => {
|
||||||
if (!imageOrKey) return "";
|
|
||||||
|
|
||||||
if (imageOrKey.startsWith("http://") || imageOrKey.startsWith("https://")) {
|
if (imageOrKey.startsWith("http://") || imageOrKey.startsWith("https://")) {
|
||||||
return imageOrKey;
|
return imageOrKey;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import Avatar from "~/components/Avatar";
|
import Avatar from "~/components/Avatar";
|
||||||
import Badge from "~/components/Badge";
|
import Badge from "~/components/Badge";
|
||||||
import CircularProgress from "~/components/CircularProgress";
|
|
||||||
import LabelIcon from "~/components/LabelIcon";
|
import LabelIcon from "~/components/LabelIcon";
|
||||||
import { getAvatarUrl } from "~/utils/helpers";
|
import { getAvatarUrl } from "~/utils/helpers";
|
||||||
|
|
||||||
@@ -8,7 +7,6 @@ const Card = ({
|
|||||||
title,
|
title,
|
||||||
labels,
|
labels,
|
||||||
members,
|
members,
|
||||||
checklists,
|
|
||||||
}: {
|
}: {
|
||||||
title: string;
|
title: string;
|
||||||
labels: { name: string; colourCode: string | null }[];
|
labels: { name: string; colourCode: string | null }[];
|
||||||
@@ -17,28 +15,7 @@ const Card = ({
|
|||||||
email: string;
|
email: string;
|
||||||
user: { name: string | null; email: string; image: string | null } | null;
|
user: { name: string | null; email: string; image: string | null } | null;
|
||||||
}[];
|
}[];
|
||||||
checklists: {
|
|
||||||
publicId: string;
|
|
||||||
name: string;
|
|
||||||
items: {
|
|
||||||
publicId: string;
|
|
||||||
title: string;
|
|
||||||
completed: boolean;
|
|
||||||
index: number;
|
|
||||||
}[];
|
|
||||||
}[];
|
|
||||||
}) => {
|
}) => {
|
||||||
const completedItems = checklists.reduce((acc, checklist) => {
|
|
||||||
return acc + checklist.items.filter((item) => item.completed).length;
|
|
||||||
}, 0);
|
|
||||||
|
|
||||||
const totalItems = checklists.reduce((acc, checklist) => {
|
|
||||||
return acc + checklist.items.length;
|
|
||||||
}, 0);
|
|
||||||
|
|
||||||
const progress =
|
|
||||||
totalItems > 0 ? Math.round((completedItems / totalItems) * 100) : 0;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col rounded-md border border-light-200 bg-light-50 px-3 py-2 text-sm text-neutral-900 dark:border-dark-200 dark:bg-dark-200 dark:text-dark-1000 dark:hover:bg-dark-300">
|
<div className="flex flex-col rounded-md border border-light-200 bg-light-50 px-3 py-2 text-sm text-neutral-900 dark:border-dark-200 dark:bg-dark-200 dark:text-dark-1000 dark:hover:bg-dark-300">
|
||||||
<span>{title}</span>
|
<span>{title}</span>
|
||||||
@@ -52,37 +29,21 @@ const Card = ({
|
|||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center justify-end gap-1">
|
<div className="isolate flex justify-end -space-x-1 overflow-hidden">
|
||||||
{checklists.length > 0 && (
|
{members.map(({ user, email }) => {
|
||||||
<div className="flex items-center gap-1 rounded-full border-[1px] border-light-300 px-2 py-1 dark:border-dark-600">
|
const avatarUrl = user?.image
|
||||||
<CircularProgress
|
? getAvatarUrl(user.image)
|
||||||
progress={progress || 2}
|
: undefined;
|
||||||
size="sm"
|
|
||||||
className="flex-shrink-0"
|
|
||||||
/>
|
|
||||||
<span className="text-[10px] text-light-900 dark:text-dark-950">
|
|
||||||
{completedItems}/{totalItems}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{members.length > 0 && (
|
|
||||||
<div className="isolate flex justify-end -space-x-1 overflow-hidden">
|
|
||||||
{members.map(({ user, email }) => {
|
|
||||||
const avatarUrl = user?.image
|
|
||||||
? getAvatarUrl(user.image)
|
|
||||||
: undefined;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Avatar
|
<Avatar
|
||||||
name={user?.name ?? ""}
|
name={user?.name ?? ""}
|
||||||
email={user?.email ?? email}
|
email={user?.email ?? email}
|
||||||
imageUrl={avatarUrl}
|
imageUrl={avatarUrl}
|
||||||
size="sm"
|
size="sm"
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import { generateUID } from "@kan/shared/utils";
|
|||||||
import Avatar from "~/components/Avatar";
|
import Avatar from "~/components/Avatar";
|
||||||
import Button from "~/components/Button";
|
import Button from "~/components/Button";
|
||||||
import CheckboxDropdown from "~/components/CheckboxDropdown";
|
import CheckboxDropdown from "~/components/CheckboxDropdown";
|
||||||
import Editor, { WorkspaceMember } from "~/components/Editor";
|
import Editor from "~/components/Editor";
|
||||||
import Input from "~/components/Input";
|
import Input from "~/components/Input";
|
||||||
import LabelIcon from "~/components/LabelIcon";
|
import LabelIcon from "~/components/LabelIcon";
|
||||||
import Toggle from "~/components/Toggle";
|
import Toggle from "~/components/Toggle";
|
||||||
@@ -46,7 +46,7 @@ export function NewCardForm({
|
|||||||
queryParams,
|
queryParams,
|
||||||
}: NewCardFormProps) {
|
}: NewCardFormProps) {
|
||||||
const { showPopup } = usePopup();
|
const { showPopup } = usePopup();
|
||||||
const { closeModal, openModal, modalStates, clearModalState } = useModal();
|
const { closeModal, openModal } = useModal();
|
||||||
|
|
||||||
const utils = api.useUtils();
|
const utils = api.useUtils();
|
||||||
|
|
||||||
@@ -85,39 +85,10 @@ export function NewCardForm({
|
|||||||
return () => subscription.unsubscribe();
|
return () => subscription.unsubscribe();
|
||||||
}, [watch, saveFormState]);
|
}, [watch, saveFormState]);
|
||||||
|
|
||||||
|
|
||||||
const { data: boardData } = api.board.byId.useQuery(queryParams, {
|
const { data: boardData } = api.board.byId.useQuery(queryParams, {
|
||||||
enabled: !!boardPublicId,
|
enabled: !!boardPublicId,
|
||||||
});
|
});
|
||||||
|
|
||||||
// this adds the new created label to selected labels
|
|
||||||
useEffect(() => {
|
|
||||||
const newLabelId = modalStates["NEW_LABEL_CREATED"];
|
|
||||||
if (newLabelId !== undefined && !labelPublicIds.includes(newLabelId)) {
|
|
||||||
setValue("labelPublicIds", [...labelPublicIds, newLabelId]);
|
|
||||||
}
|
|
||||||
}, [modalStates, labelPublicIds]);
|
|
||||||
|
|
||||||
// this removes the deleted label from selected labels if it is selected
|
|
||||||
useEffect(() => {
|
|
||||||
if (boardData?.labels) {
|
|
||||||
const availableLabelIds = boardData.labels.map(label => label.publicId);
|
|
||||||
const newLabelId = modalStates["NEW_LABEL_CREATED"];
|
|
||||||
|
|
||||||
if (newLabelId && availableLabelIds.includes(newLabelId)) {
|
|
||||||
clearModalState("NEW_LABEL_CREATED");
|
|
||||||
}
|
|
||||||
|
|
||||||
const validLabelIds = labelPublicIds.filter(id =>
|
|
||||||
availableLabelIds.includes(id) || id === newLabelId
|
|
||||||
);
|
|
||||||
|
|
||||||
if (validLabelIds.length !== labelPublicIds.length) {
|
|
||||||
setValue("labelPublicIds", validLabelIds);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, [boardData?.labels, labelPublicIds, modalStates["NEW_LABEL_CREATED"]]);
|
|
||||||
|
|
||||||
const createCard = api.card.create.useMutation({
|
const createCard = api.card.create.useMutation({
|
||||||
onMutate: async (args) => {
|
onMutate: async (args) => {
|
||||||
await utils.board.byId.cancel();
|
await utils.board.byId.cancel();
|
||||||
@@ -322,17 +293,6 @@ export function NewCardForm({
|
|||||||
setValue("description", value);
|
setValue("description", value);
|
||||||
saveFormState({ ...formState, description: value });
|
saveFormState({ ...formState, description: value });
|
||||||
}}
|
}}
|
||||||
workspaceMembers={
|
|
||||||
boardData?.workspace.members?.map((member): WorkspaceMember => ({
|
|
||||||
publicId: member.publicId,
|
|
||||||
email: member.email,
|
|
||||||
user: member.user ? {
|
|
||||||
id: member.publicId,
|
|
||||||
name: member.user.name,
|
|
||||||
image: member.user.image ?? null,
|
|
||||||
} : null,
|
|
||||||
})) ?? []
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import type { UpdateBoardInput } from "@kan/api/types";
|
|||||||
|
|
||||||
import Button from "~/components/Button";
|
import Button from "~/components/Button";
|
||||||
import { DeleteLabelConfirmation } from "~/components/DeleteLabelConfirmation";
|
import { DeleteLabelConfirmation } from "~/components/DeleteLabelConfirmation";
|
||||||
|
import FeedbackModal from "~/components/FeedbackModal";
|
||||||
import { LabelForm } from "~/components/LabelForm";
|
import { LabelForm } from "~/components/LabelForm";
|
||||||
import Modal from "~/components/modal";
|
import Modal from "~/components/modal";
|
||||||
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
||||||
@@ -491,7 +492,6 @@ export default function BoardPage() {
|
|||||||
title={card.title}
|
title={card.title}
|
||||||
labels={card.labels}
|
labels={card.labels}
|
||||||
members={card.members}
|
members={card.members}
|
||||||
checklists={card.checklists ?? []}
|
|
||||||
/>
|
/>
|
||||||
</Link>
|
</Link>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -5,11 +5,9 @@ import { de, enGB, es, fr, it, nl } from "date-fns/locale";
|
|||||||
import {
|
import {
|
||||||
HiOutlineArrowLeft,
|
HiOutlineArrowLeft,
|
||||||
HiOutlineArrowRight,
|
HiOutlineArrowRight,
|
||||||
HiOutlineCheckCircle,
|
|
||||||
HiOutlinePencil,
|
HiOutlinePencil,
|
||||||
HiOutlinePlus,
|
HiOutlinePlus,
|
||||||
HiOutlineTag,
|
HiOutlineTag,
|
||||||
HiOutlineTrash,
|
|
||||||
HiOutlineUserMinus,
|
HiOutlineUserMinus,
|
||||||
HiOutlineUserPlus,
|
HiOutlineUserPlus,
|
||||||
} from "react-icons/hi2";
|
} from "react-icons/hi2";
|
||||||
@@ -33,11 +31,6 @@ const dateLocaleMap = {
|
|||||||
nl: nl,
|
nl: nl,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
const truncate = (value: string | null, maxLength = 50) => {
|
|
||||||
if (!value) return value;
|
|
||||||
return value.length > maxLength ? `${value.slice(0, maxLength - 1)}…` : value;
|
|
||||||
};
|
|
||||||
|
|
||||||
const getActivityText = ({
|
const getActivityText = ({
|
||||||
type,
|
type,
|
||||||
toTitle,
|
toTitle,
|
||||||
@@ -46,7 +39,6 @@ const getActivityText = ({
|
|||||||
memberName,
|
memberName,
|
||||||
isSelf,
|
isSelf,
|
||||||
label,
|
label,
|
||||||
fromTitle,
|
|
||||||
}: {
|
}: {
|
||||||
type: ActivityType;
|
type: ActivityType;
|
||||||
toTitle: string | null;
|
toTitle: string | null;
|
||||||
@@ -55,7 +47,6 @@ const getActivityText = ({
|
|||||||
memberName: string | null;
|
memberName: string | null;
|
||||||
isSelf: boolean;
|
isSelf: boolean;
|
||||||
label: string | null;
|
label: string | null;
|
||||||
fromTitle?: string | null;
|
|
||||||
}) => {
|
}) => {
|
||||||
const ACTIVITY_TYPE_MAP = {
|
const ACTIVITY_TYPE_MAP = {
|
||||||
"card.created": t`created the card`,
|
"card.created": t`created the card`,
|
||||||
@@ -66,14 +57,6 @@ const getActivityText = ({
|
|||||||
"card.updated.label.removed": t`removed a label from the card`,
|
"card.updated.label.removed": t`removed a label from the card`,
|
||||||
"card.updated.member.added": t`added a member to the card`,
|
"card.updated.member.added": t`added a member to the card`,
|
||||||
"card.updated.member.removed": t`removed a member from the card`,
|
"card.updated.member.removed": t`removed a member from the card`,
|
||||||
"card.updated.checklist.added": t`added a checklist`,
|
|
||||||
"card.updated.checklist.renamed": t`renamed a checklist`,
|
|
||||||
"card.updated.checklist.deleted": t`deleted a checklist`,
|
|
||||||
"card.updated.checklist.item.added": t`added a checklist item`,
|
|
||||||
"card.updated.checklist.item.updated": t`updated a checklist item`,
|
|
||||||
"card.updated.checklist.item.completed": t`completed a checklist item`,
|
|
||||||
"card.updated.checklist.item.uncompleted": t`marked a checklist item as incomplete`,
|
|
||||||
"card.updated.checklist.item.deleted": t`deleted a checklist item`,
|
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
if (!(type in ACTIVITY_TYPE_MAP)) return null;
|
if (!(type in ACTIVITY_TYPE_MAP)) return null;
|
||||||
@@ -88,7 +71,7 @@ const getActivityText = ({
|
|||||||
if (type === "card.updated.title" && toTitle) {
|
if (type === "card.updated.title" && toTitle) {
|
||||||
return (
|
return (
|
||||||
<Trans>
|
<Trans>
|
||||||
updated the title to <TextHighlight>{truncate(toTitle)}</TextHighlight>
|
updated the title to <TextHighlight>{toTitle}</TextHighlight>
|
||||||
</Trans>
|
</Trans>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -96,9 +79,8 @@ const getActivityText = ({
|
|||||||
if (type === "card.updated.list" && fromList && toList) {
|
if (type === "card.updated.list" && fromList && toList) {
|
||||||
return (
|
return (
|
||||||
<Trans>
|
<Trans>
|
||||||
moved the card from <TextHighlight>{truncate(fromList)}</TextHighlight>{" "}
|
moved the card from <TextHighlight>{fromList}</TextHighlight> to
|
||||||
to
|
<TextHighlight>{toList}</TextHighlight>
|
||||||
<TextHighlight>{truncate(toList)}</TextHighlight>
|
|
||||||
</Trans>
|
</Trans>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -108,8 +90,7 @@ const getActivityText = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Trans>
|
<Trans>
|
||||||
assigned <TextHighlight>{truncate(memberName)}</TextHighlight> to the
|
assigned <TextHighlight>{memberName}</TextHighlight> to the card
|
||||||
card
|
|
||||||
</Trans>
|
</Trans>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -119,8 +100,7 @@ const getActivityText = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Trans>
|
<Trans>
|
||||||
unassigned <TextHighlight>{truncate(memberName)}</TextHighlight> from
|
unassigned <TextHighlight>{memberName}</TextHighlight> from the card
|
||||||
the card
|
|
||||||
</Trans>
|
</Trans>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -128,7 +108,7 @@ const getActivityText = ({
|
|||||||
if (type === "card.updated.label.added" && label) {
|
if (type === "card.updated.label.added" && label) {
|
||||||
return (
|
return (
|
||||||
<Trans>
|
<Trans>
|
||||||
added label <TextHighlight>{truncate(label)}</TextHighlight>
|
added label <TextHighlight>{label}</TextHighlight>
|
||||||
</Trans>
|
</Trans>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -136,75 +116,7 @@ const getActivityText = ({
|
|||||||
if (type === "card.updated.label.removed" && label) {
|
if (type === "card.updated.label.removed" && label) {
|
||||||
return (
|
return (
|
||||||
<Trans>
|
<Trans>
|
||||||
removed label <TextHighlight>{truncate(label)}</TextHighlight>
|
removed label <TextHighlight>{label}</TextHighlight>
|
||||||
</Trans>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type === "card.updated.checklist.added" && toTitle) {
|
|
||||||
return (
|
|
||||||
<Trans>
|
|
||||||
added checklist <TextHighlight>{truncate(toTitle)}</TextHighlight>
|
|
||||||
</Trans>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type === "card.updated.checklist.renamed" && toTitle) {
|
|
||||||
return (
|
|
||||||
<Trans>
|
|
||||||
renamed checklist <TextHighlight>{truncate(toTitle)}</TextHighlight>
|
|
||||||
</Trans>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type === "card.updated.checklist.deleted" && fromTitle) {
|
|
||||||
return (
|
|
||||||
<Trans>
|
|
||||||
deleted checklist <TextHighlight>{truncate(fromTitle)}</TextHighlight>
|
|
||||||
</Trans>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type === "card.updated.checklist.item.added" && toTitle) {
|
|
||||||
return (
|
|
||||||
<Trans>
|
|
||||||
added checklist item <TextHighlight>{truncate(toTitle)}</TextHighlight>
|
|
||||||
</Trans>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type === "card.updated.checklist.item.updated" && toTitle) {
|
|
||||||
return (
|
|
||||||
<Trans>
|
|
||||||
renamed checklist item to{" "}
|
|
||||||
<TextHighlight>{truncate(toTitle)}</TextHighlight>
|
|
||||||
</Trans>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type === "card.updated.checklist.item.completed" && toTitle) {
|
|
||||||
return (
|
|
||||||
<Trans>
|
|
||||||
completed checklist item{" "}
|
|
||||||
<TextHighlight>{truncate(toTitle)}</TextHighlight>
|
|
||||||
</Trans>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type === "card.updated.checklist.item.uncompleted" && toTitle) {
|
|
||||||
return (
|
|
||||||
<Trans>
|
|
||||||
marked checklist item <TextHighlight>{truncate(toTitle)}</TextHighlight>{" "}
|
|
||||||
as incomplete
|
|
||||||
</Trans>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type === "card.updated.checklist.item.deleted" && fromTitle) {
|
|
||||||
return (
|
|
||||||
<Trans>
|
|
||||||
deleted checklist item{" "}
|
|
||||||
<TextHighlight>{truncate(fromTitle)}</TextHighlight>
|
|
||||||
</Trans>
|
</Trans>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -221,14 +133,6 @@ const ACTIVITY_ICON_MAP: Partial<Record<ActivityType, React.ReactNode | null>> =
|
|||||||
"card.updated.label.removed": <HiOutlineTag />,
|
"card.updated.label.removed": <HiOutlineTag />,
|
||||||
"card.updated.member.added": <HiOutlineUserPlus />,
|
"card.updated.member.added": <HiOutlineUserPlus />,
|
||||||
"card.updated.member.removed": <HiOutlineUserMinus />,
|
"card.updated.member.removed": <HiOutlineUserMinus />,
|
||||||
"card.updated.checklist.added": <HiOutlinePlus />,
|
|
||||||
"card.updated.checklist.renamed": <HiOutlinePencil />,
|
|
||||||
"card.updated.checklist.deleted": <HiOutlineTrash />,
|
|
||||||
"card.updated.checklist.item.added": <HiOutlinePlus />,
|
|
||||||
"card.updated.checklist.item.updated": <HiOutlinePencil />,
|
|
||||||
"card.updated.checklist.item.completed": <HiOutlineCheckCircle />,
|
|
||||||
"card.updated.checklist.item.uncompleted": <HiOutlineCheckCircle />,
|
|
||||||
"card.updated.checklist.item.deleted": <HiOutlineTrash />,
|
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
const getActivityIcon = (
|
const getActivityIcon = (
|
||||||
@@ -251,13 +155,11 @@ const ActivityList = ({
|
|||||||
cardPublicId,
|
cardPublicId,
|
||||||
isLoading,
|
isLoading,
|
||||||
isAdmin,
|
isAdmin,
|
||||||
isViewOnly,
|
|
||||||
}: {
|
}: {
|
||||||
activities: NonNullable<GetCardByIdOutput>["activities"];
|
activities: NonNullable<GetCardByIdOutput>["activities"];
|
||||||
cardPublicId: string;
|
cardPublicId: string;
|
||||||
isLoading: boolean;
|
isLoading: boolean;
|
||||||
isAdmin?: boolean;
|
isAdmin?: boolean;
|
||||||
isViewOnly?: boolean;
|
|
||||||
}) => {
|
}) => {
|
||||||
const { data } = authClient.useSession();
|
const { data } = authClient.useSession();
|
||||||
const { locale } = useLocalisation();
|
const { locale } = useLocalisation();
|
||||||
@@ -275,7 +177,6 @@ const ActivityList = ({
|
|||||||
memberName: activity.member?.user?.name ?? null,
|
memberName: activity.member?.user?.name ?? null,
|
||||||
isSelf: activity.member?.user?.id === data?.user.id,
|
isSelf: activity.member?.user?.id === data?.user.id,
|
||||||
label: activity.label?.name ?? null,
|
label: activity.label?.name ?? null,
|
||||||
fromTitle: activity.fromTitle ?? null,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (activity.type === "card.updated.comment.added")
|
if (activity.type === "card.updated.comment.added")
|
||||||
@@ -292,7 +193,6 @@ const ActivityList = ({
|
|||||||
isEdited={!!activity.comment?.updatedAt}
|
isEdited={!!activity.comment?.updatedAt}
|
||||||
isAuthor={activity.comment?.createdBy === data?.user.id}
|
isAuthor={activity.comment?.createdBy === data?.user.id}
|
||||||
isAdmin={isAdmin ?? false}
|
isAdmin={isAdmin ?? false}
|
||||||
isViewOnly={!!isViewOnly}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,197 +0,0 @@
|
|||||||
import { t } from "@lingui/core/macro";
|
|
||||||
import { useEffect, useState } from "react";
|
|
||||||
import ContentEditable from "react-contenteditable";
|
|
||||||
import { HiXMark } from "react-icons/hi2";
|
|
||||||
import { twMerge } from "tailwind-merge";
|
|
||||||
|
|
||||||
import { usePopup } from "~/providers/popup";
|
|
||||||
import { api } from "~/utils/api";
|
|
||||||
|
|
||||||
interface ChecklistItemRowProps {
|
|
||||||
item: {
|
|
||||||
publicId: string;
|
|
||||||
title: string;
|
|
||||||
completed: boolean;
|
|
||||||
};
|
|
||||||
cardPublicId: string;
|
|
||||||
viewOnly?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function ChecklistItemRow({
|
|
||||||
item,
|
|
||||||
cardPublicId,
|
|
||||||
viewOnly = false,
|
|
||||||
}: ChecklistItemRowProps) {
|
|
||||||
const utils = api.useUtils();
|
|
||||||
const { showPopup } = usePopup();
|
|
||||||
|
|
||||||
const [title, setTitle] = useState("");
|
|
||||||
const [completed, setCompleted] = useState(false);
|
|
||||||
|
|
||||||
const updateItem = api.checklist.updateItem.useMutation({
|
|
||||||
onMutate: async (vars) => {
|
|
||||||
await utils.card.byId.cancel({ cardPublicId });
|
|
||||||
const previous = utils.card.byId.getData({ cardPublicId });
|
|
||||||
utils.card.byId.setData({ cardPublicId }, (old) => {
|
|
||||||
if (!old) return old as any;
|
|
||||||
const updatedChecklists = old.checklists.map((cl) => ({
|
|
||||||
...cl,
|
|
||||||
items: cl.items.map((ci) =>
|
|
||||||
ci.publicId === item.publicId
|
|
||||||
? {
|
|
||||||
...ci,
|
|
||||||
...(vars.title !== undefined ? { title: vars.title } : {}),
|
|
||||||
...(vars.completed !== undefined
|
|
||||||
? { completed: vars.completed }
|
|
||||||
: {}),
|
|
||||||
}
|
|
||||||
: ci,
|
|
||||||
),
|
|
||||||
}));
|
|
||||||
return { ...old, checklists: updatedChecklists } as typeof old;
|
|
||||||
});
|
|
||||||
return { previous };
|
|
||||||
},
|
|
||||||
onError: (_err, _vars, ctx) => {
|
|
||||||
if (ctx?.previous)
|
|
||||||
utils.card.byId.setData({ cardPublicId }, ctx.previous);
|
|
||||||
showPopup({
|
|
||||||
header: t`Unable to update checklist item`,
|
|
||||||
message: t`Please try again later, or contact customer support.`,
|
|
||||||
icon: "error",
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onSettled: async () => {
|
|
||||||
await utils.card.byId.invalidate({ cardPublicId });
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const deleteItem = api.checklist.deleteItem.useMutation({
|
|
||||||
onMutate: async () => {
|
|
||||||
await utils.card.byId.cancel({ cardPublicId });
|
|
||||||
const previous = utils.card.byId.getData({ cardPublicId });
|
|
||||||
utils.card.byId.setData({ cardPublicId }, (old) => {
|
|
||||||
if (!old) return old as any;
|
|
||||||
const updatedChecklists = old.checklists.map((cl) => ({
|
|
||||||
...cl,
|
|
||||||
items: cl.items.filter((ci) => ci.publicId !== item.publicId),
|
|
||||||
}));
|
|
||||||
return { ...old, checklists: updatedChecklists } as typeof old;
|
|
||||||
});
|
|
||||||
return { previous };
|
|
||||||
},
|
|
||||||
onError: (_err, _vars, ctx) => {
|
|
||||||
if (ctx?.previous)
|
|
||||||
utils.card.byId.setData({ cardPublicId }, ctx.previous);
|
|
||||||
showPopup({
|
|
||||||
header: t`Unable to delete checklist item`,
|
|
||||||
message: t`Please try again later, or contact customer support.`,
|
|
||||||
icon: "error",
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onSettled: async () => {
|
|
||||||
await utils.card.byId.invalidate({ cardPublicId });
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// Only resync from props when switching items to avoid clobbering edits
|
|
||||||
useEffect(() => {
|
|
||||||
setTitle(item.title);
|
|
||||||
setCompleted(item.completed);
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [item.publicId]);
|
|
||||||
|
|
||||||
const sanitizeHtmlToPlainText = (html: string): string =>
|
|
||||||
html
|
|
||||||
.replace(/<br\s*\/?>(\n)?/gi, "\n")
|
|
||||||
.replace(/<div><br\s*\/?><\/div>/gi, "")
|
|
||||||
.replace(/<[^>]*>/g, "")
|
|
||||||
.replace(/ /g, " ")
|
|
||||||
.trim();
|
|
||||||
|
|
||||||
const handleToggleCompleted = () => {
|
|
||||||
if (viewOnly) return;
|
|
||||||
setCompleted((prev) => !prev);
|
|
||||||
updateItem.mutate({
|
|
||||||
checklistItemPublicId: item.publicId,
|
|
||||||
completed: !completed,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const commitTitle = (rawHtml: string) => {
|
|
||||||
if (viewOnly) return;
|
|
||||||
const plain = sanitizeHtmlToPlainText(rawHtml);
|
|
||||||
if (!plain || plain === item.title) {
|
|
||||||
setTitle(item.title);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setTitle(plain);
|
|
||||||
updateItem.mutate({
|
|
||||||
checklistItemPublicId: item.publicId,
|
|
||||||
title: plain,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleDelete = () => {
|
|
||||||
if (viewOnly) return;
|
|
||||||
deleteItem.mutate({ checklistItemPublicId: item.publicId });
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="group relative flex items-start gap-3 rounded-md py-2 pl-4 hover:bg-light-100 dark:hover:bg-dark-100">
|
|
||||||
<label
|
|
||||||
className={`relative mt-[2px] inline-flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center`}
|
|
||||||
>
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
checked={completed}
|
|
||||||
onChange={(e) => {
|
|
||||||
if (viewOnly) {
|
|
||||||
e.preventDefault();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
handleToggleCompleted();
|
|
||||||
}}
|
|
||||||
className={twMerge(
|
|
||||||
"h-[16px] w-[16px] appearance-none rounded-md border border-light-500 bg-transparent outline-none ring-0 checked:bg-blue-600 focus:shadow-none focus:ring-0 focus:ring-offset-0 focus-visible:outline-none dark:border-dark-500 dark:hover:border-dark-500",
|
|
||||||
viewOnly ? "cursor-default" : "cursor-pointer",
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
</label>
|
|
||||||
<div className="flex-1 pr-7">
|
|
||||||
<ContentEditable
|
|
||||||
html={title}
|
|
||||||
disabled={viewOnly}
|
|
||||||
onChange={(e) => setTitle(e.target.value)}
|
|
||||||
// @ts-expect-error - valid event
|
|
||||||
onBlur={(e: Event) => commitTitle(e.target.innerHTML as string)}
|
|
||||||
className={twMerge(
|
|
||||||
"m-0 min-h-[20px] w-full p-0 text-sm leading-[20px] text-light-950 outline-none focus-visible:outline-none dark:text-dark-950",
|
|
||||||
viewOnly && "cursor-default",
|
|
||||||
)}
|
|
||||||
placeholder={t`Add details...`}
|
|
||||||
onKeyDown={(e) => {
|
|
||||||
if (viewOnly) return;
|
|
||||||
if (e.key === "Enter") {
|
|
||||||
e.preventDefault();
|
|
||||||
commitTitle(title);
|
|
||||||
}
|
|
||||||
if (e.key === "Escape") {
|
|
||||||
e.preventDefault();
|
|
||||||
setTitle(item.title);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
{!viewOnly && (
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
onClick={handleDelete}
|
|
||||||
className="absolute right-1 top-1/2 hidden -translate-y-1/2 rounded-md p-1 text-light-900 group-hover:block hover:bg-light-200 dark:text-dark-700 dark:hover:bg-dark-200"
|
|
||||||
>
|
|
||||||
<HiXMark size={16} />
|
|
||||||
</button>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
import { t } from "@lingui/core/macro";
|
|
||||||
import { useEffect, useRef, useState } from "react";
|
|
||||||
import { twMerge } from "tailwind-merge";
|
|
||||||
|
|
||||||
import { usePopup } from "~/providers/popup";
|
|
||||||
import { api } from "~/utils/api";
|
|
||||||
|
|
||||||
export default function ChecklistNameInput({
|
|
||||||
checklistPublicId,
|
|
||||||
initialName,
|
|
||||||
cardPublicId,
|
|
||||||
viewOnly = false,
|
|
||||||
}: {
|
|
||||||
checklistPublicId: string;
|
|
||||||
initialName: string;
|
|
||||||
cardPublicId: string;
|
|
||||||
viewOnly?: boolean;
|
|
||||||
}) {
|
|
||||||
const utils = api.useUtils();
|
|
||||||
const { showPopup } = usePopup();
|
|
||||||
const [name, setName] = useState(initialName);
|
|
||||||
const inputRef = useRef<HTMLInputElement | null>(null);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setName(initialName);
|
|
||||||
}, [initialName, checklistPublicId]);
|
|
||||||
|
|
||||||
const update = api.checklist.update.useMutation({
|
|
||||||
onMutate: async (vars) => {
|
|
||||||
await utils.card.byId.cancel({ cardPublicId });
|
|
||||||
const previous = utils.card.byId.getData({ cardPublicId });
|
|
||||||
utils.card.byId.setData({ cardPublicId }, (old) => {
|
|
||||||
if (!old) return old as any;
|
|
||||||
const updated = old.checklists.map((cl) =>
|
|
||||||
cl.publicId === checklistPublicId ? { ...cl, name: vars.name } : cl,
|
|
||||||
);
|
|
||||||
return { ...old, checklists: updated } as typeof old;
|
|
||||||
});
|
|
||||||
return { previous };
|
|
||||||
},
|
|
||||||
onError: (_err, _vars, ctx) => {
|
|
||||||
if (ctx?.previous)
|
|
||||||
utils.card.byId.setData({ cardPublicId }, ctx.previous);
|
|
||||||
showPopup({
|
|
||||||
header: t`Unable to update checklist`,
|
|
||||||
message: t`Please try again later, or contact customer support.`,
|
|
||||||
icon: "error",
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onSettled: async () => {
|
|
||||||
await utils.card.byId.invalidate({ cardPublicId });
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const commit = () => {
|
|
||||||
if (viewOnly) return;
|
|
||||||
const trimmed = name.trim();
|
|
||||||
if (!trimmed || trimmed === initialName) return;
|
|
||||||
update.mutate({ checklistPublicId, name: trimmed });
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<input
|
|
||||||
ref={inputRef}
|
|
||||||
type="text"
|
|
||||||
value={name}
|
|
||||||
readOnly={viewOnly}
|
|
||||||
onChange={(e) => setName(e.target.value)}
|
|
||||||
onBlur={commit}
|
|
||||||
onKeyDown={(e) => {
|
|
||||||
if (viewOnly) return;
|
|
||||||
if (e.key === "Enter") {
|
|
||||||
e.preventDefault();
|
|
||||||
commit();
|
|
||||||
inputRef.current?.blur();
|
|
||||||
}
|
|
||||||
if (e.key === "Escape") {
|
|
||||||
e.preventDefault();
|
|
||||||
setName(initialName);
|
|
||||||
inputRef.current?.blur();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
title={name}
|
|
||||||
className={twMerge(
|
|
||||||
"text-md block w-full truncate border-0 bg-transparent p-0 py-0 font-medium text-light-1000 outline-none focus:ring-0 dark:text-dark-1000",
|
|
||||||
viewOnly && "cursor-default",
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
import { HiPlus, HiXMark } from "react-icons/hi2";
|
|
||||||
|
|
||||||
import CircularProgress from "~/components/CircularProgress";
|
|
||||||
import { useModal } from "~/providers/modal";
|
|
||||||
import ChecklistItemRow from "./ChecklistItemRow";
|
|
||||||
import ChecklistNameInput from "./ChecklistNameInput";
|
|
||||||
import NewChecklistItemForm from "./NewChecklistItemForm";
|
|
||||||
|
|
||||||
interface ChecklistItem {
|
|
||||||
publicId: string;
|
|
||||||
title: string;
|
|
||||||
completed: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Checklist {
|
|
||||||
publicId: string;
|
|
||||||
name: string;
|
|
||||||
items: ChecklistItem[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ChecklistsProps {
|
|
||||||
checklists: Checklist[];
|
|
||||||
cardPublicId: string;
|
|
||||||
activeChecklistForm?: string | null;
|
|
||||||
setActiveChecklistForm?: (id: string | null) => void;
|
|
||||||
viewOnly?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function Checklists({
|
|
||||||
checklists,
|
|
||||||
cardPublicId,
|
|
||||||
activeChecklistForm,
|
|
||||||
setActiveChecklistForm,
|
|
||||||
viewOnly = false,
|
|
||||||
}: ChecklistsProps) {
|
|
||||||
const { openModal } = useModal();
|
|
||||||
|
|
||||||
if (!checklists || checklists.length === 0) return null;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="border-light-300 pb-4 dark:border-dark-300">
|
|
||||||
<div>
|
|
||||||
{checklists.map((checklist) => {
|
|
||||||
const completedItems = checklist.items.filter(
|
|
||||||
(item) => item.completed,
|
|
||||||
);
|
|
||||||
const progress =
|
|
||||||
checklist.items.length > 0 && completedItems.length > 0
|
|
||||||
? (completedItems.length / checklist.items.length) * 100
|
|
||||||
: 2;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div key={checklist.publicId} className="mb-4">
|
|
||||||
<div className="mb-2 flex items-center font-medium text-light-1000 dark:text-dark-1000">
|
|
||||||
<div className="min-w-0 flex-1">
|
|
||||||
<ChecklistNameInput
|
|
||||||
checklistPublicId={checklist.publicId}
|
|
||||||
initialName={checklist.name}
|
|
||||||
cardPublicId={cardPublicId}
|
|
||||||
viewOnly={viewOnly}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
{!viewOnly && (
|
|
||||||
<div className="ml-2 flex flex-shrink-0 items-center gap-2">
|
|
||||||
<div className="flex items-center gap-1 rounded-full border-[1px] border-light-300 px-2 py-1 dark:border-dark-300">
|
|
||||||
<CircularProgress
|
|
||||||
progress={progress}
|
|
||||||
size="sm"
|
|
||||||
className="flex-shrink-0"
|
|
||||||
/>
|
|
||||||
<span className="text-[11px] text-light-900 dark:text-dark-700">
|
|
||||||
{completedItems.length}/{checklist.items.length}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<button
|
|
||||||
className="rounded-md p-1 text-light-900 hover:bg-light-100 dark:text-dark-700 dark:hover:bg-dark-100"
|
|
||||||
onClick={() =>
|
|
||||||
openModal("DELETE_CHECKLIST", checklist.publicId)
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<HiXMark size={16} />
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
onClick={() =>
|
|
||||||
setActiveChecklistForm?.(checklist.publicId)
|
|
||||||
}
|
|
||||||
className="rounded-md p-1 text-light-900 hover:bg-light-100 dark:text-dark-700 dark:hover:bg-dark-100"
|
|
||||||
>
|
|
||||||
<HiPlus size={16} />
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{viewOnly && (
|
|
||||||
<div className="ml-2 flex flex-shrink-0 items-center gap-2">
|
|
||||||
<div className="flex items-center gap-1 rounded-full border-[1px] border-light-300 px-2 py-1 dark:border-dark-300">
|
|
||||||
<CircularProgress
|
|
||||||
progress={progress}
|
|
||||||
size="sm"
|
|
||||||
className="flex-shrink-0"
|
|
||||||
/>
|
|
||||||
<span className="text-[11px] text-light-900 dark:text-dark-700">
|
|
||||||
{completedItems.length}/{checklist.items.length}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="ml-1">
|
|
||||||
{checklist.items.map((item) => (
|
|
||||||
<ChecklistItemRow
|
|
||||||
key={item.publicId}
|
|
||||||
item={{
|
|
||||||
publicId: item.publicId,
|
|
||||||
title: item.title,
|
|
||||||
completed: item.completed,
|
|
||||||
}}
|
|
||||||
cardPublicId={cardPublicId}
|
|
||||||
viewOnly={viewOnly}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{activeChecklistForm === checklist.publicId && !viewOnly && (
|
|
||||||
<div className="ml-1">
|
|
||||||
<NewChecklistItemForm
|
|
||||||
checklistPublicId={checklist.publicId}
|
|
||||||
cardPublicId={cardPublicId}
|
|
||||||
onCancel={() => setActiveChecklistForm?.(null)}
|
|
||||||
readOnly={viewOnly}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -27,7 +27,6 @@ const Comment = ({
|
|||||||
isAuthor,
|
isAuthor,
|
||||||
isAdmin,
|
isAdmin,
|
||||||
isEdited = false,
|
isEdited = false,
|
||||||
isViewOnly = false,
|
|
||||||
}: {
|
}: {
|
||||||
publicId: string | undefined;
|
publicId: string | undefined;
|
||||||
cardPublicId: string;
|
cardPublicId: string;
|
||||||
@@ -39,7 +38,6 @@ const Comment = ({
|
|||||||
isAuthor: boolean;
|
isAuthor: boolean;
|
||||||
isAdmin: boolean;
|
isAdmin: boolean;
|
||||||
isEdited: boolean;
|
isEdited: boolean;
|
||||||
isViewOnly: boolean;
|
|
||||||
}) => {
|
}) => {
|
||||||
const [isEditing, setIsEditing] = useState(false);
|
const [isEditing, setIsEditing] = useState(false);
|
||||||
const utils = api.useUtils();
|
const utils = api.useUtils();
|
||||||
@@ -126,7 +124,7 @@ const Comment = ({
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{dropdownItems.length > 0 && !isViewOnly && (
|
{dropdownItems.length > 0 && (
|
||||||
<div className="absolute right-4 top-4">
|
<div className="absolute right-4 top-4">
|
||||||
<Dropdown items={dropdownItems}>
|
<Dropdown items={dropdownItems}>
|
||||||
<HiEllipsisHorizontal className="h-5 w-5 text-light-900 dark:text-dark-800" />
|
<HiEllipsisHorizontal className="h-5 w-5 text-light-900 dark:text-dark-800" />
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
import { t } from "@lingui/core/macro";
|
|
||||||
|
|
||||||
import Button from "~/components/Button";
|
|
||||||
import { useModal } from "~/providers/modal";
|
|
||||||
import { usePopup } from "~/providers/popup";
|
|
||||||
import { api } from "~/utils/api";
|
|
||||||
|
|
||||||
export function DeleteChecklistConfirmation({
|
|
||||||
cardPublicId,
|
|
||||||
checklistPublicId,
|
|
||||||
}: {
|
|
||||||
cardPublicId: string;
|
|
||||||
checklistPublicId: string;
|
|
||||||
}) {
|
|
||||||
const { closeModal } = useModal();
|
|
||||||
const { showPopup } = usePopup();
|
|
||||||
const utils = api.useUtils();
|
|
||||||
|
|
||||||
const deleteChecklist = api.checklist.delete.useMutation({
|
|
||||||
onMutate: async () => {
|
|
||||||
await utils.card.byId.cancel({ cardPublicId });
|
|
||||||
const previous = utils.card.byId.getData({ cardPublicId });
|
|
||||||
utils.card.byId.setData({ cardPublicId }, (old) => {
|
|
||||||
if (!old) return old as any;
|
|
||||||
const updatedChecklists = old.checklists.filter(
|
|
||||||
(cl) => cl.publicId !== checklistPublicId,
|
|
||||||
);
|
|
||||||
return { ...old, checklists: updatedChecklists } as typeof old;
|
|
||||||
});
|
|
||||||
return { previous };
|
|
||||||
},
|
|
||||||
onError: (_err, _vars, ctx) => {
|
|
||||||
if (ctx?.previous)
|
|
||||||
utils.card.byId.setData({ cardPublicId }, ctx.previous);
|
|
||||||
showPopup({
|
|
||||||
header: t`Unable to delete checklist`,
|
|
||||||
message: t`Please try again later, or contact customer support.`,
|
|
||||||
icon: "error",
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onSettled: async () => {
|
|
||||||
closeModal();
|
|
||||||
await utils.card.byId.invalidate({ cardPublicId });
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const handleDelete = () => {
|
|
||||||
deleteChecklist.mutate({ checklistPublicId });
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="p-5">
|
|
||||||
<div className="flex w-full flex-col justify-between pb-4">
|
|
||||||
<h2 className="text-md pb-4 font-medium text-neutral-900 dark:text-dark-1000">
|
|
||||||
{t`Are you sure you want to delete this checklist?`}
|
|
||||||
</h2>
|
|
||||||
<p className="text-sm font-medium text-light-900 dark:text-dark-900">
|
|
||||||
{t`This action can't be undone.`}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="mt-5 flex justify-end space-x-2 sm:mt-6">
|
|
||||||
<Button variant="secondary" onClick={() => closeModal()}>
|
|
||||||
{t`Cancel`}
|
|
||||||
</Button>
|
|
||||||
<Button onClick={handleDelete} isLoading={deleteChecklist.isPending}>
|
|
||||||
{t`Delete`}
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,5 @@
|
|||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import {
|
import { HiEllipsisHorizontal, HiOutlineTrash } from "react-icons/hi2";
|
||||||
HiEllipsisHorizontal,
|
|
||||||
HiOutlineCheckCircle,
|
|
||||||
HiOutlineTrash,
|
|
||||||
} from "react-icons/hi2";
|
|
||||||
|
|
||||||
import Dropdown from "~/components/Dropdown";
|
import Dropdown from "~/components/Dropdown";
|
||||||
import { useModal } from "~/providers/modal";
|
import { useModal } from "~/providers/modal";
|
||||||
@@ -14,13 +10,6 @@ export default function BoardDropdown() {
|
|||||||
return (
|
return (
|
||||||
<Dropdown
|
<Dropdown
|
||||||
items={[
|
items={[
|
||||||
{
|
|
||||||
label: t`Add checklist`,
|
|
||||||
action: () => openModal("ADD_CHECKLIST"),
|
|
||||||
icon: (
|
|
||||||
<HiOutlineCheckCircle className="h-[16px] w-[16px] text-dark-900" />
|
|
||||||
),
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: t`Delete card`,
|
label: t`Delete card`,
|
||||||
action: () => openModal("DELETE_CARD"),
|
action: () => openModal("DELETE_CARD"),
|
||||||
|
|||||||
@@ -1,140 +0,0 @@
|
|||||||
import { t } from "@lingui/core/macro";
|
|
||||||
import { useEffect } from "react";
|
|
||||||
import { useForm } from "react-hook-form";
|
|
||||||
import { HiXMark } from "react-icons/hi2";
|
|
||||||
|
|
||||||
import { generateUID } from "@kan/shared/utils";
|
|
||||||
|
|
||||||
import Button from "~/components/Button";
|
|
||||||
import Input from "~/components/Input";
|
|
||||||
import { useModal } from "~/providers/modal";
|
|
||||||
import { usePopup } from "~/providers/popup";
|
|
||||||
import { api } from "~/utils/api";
|
|
||||||
|
|
||||||
interface NewChecklistFormInput {
|
|
||||||
name: string;
|
|
||||||
cardPublicId: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function NewChecklistForm({ cardPublicId }: { cardPublicId: string }) {
|
|
||||||
const { closeModal, setModalState } = useModal();
|
|
||||||
const { showPopup } = usePopup();
|
|
||||||
|
|
||||||
const utils = api.useUtils();
|
|
||||||
|
|
||||||
const { register, handleSubmit, reset, watch } =
|
|
||||||
useForm<NewChecklistFormInput>({
|
|
||||||
defaultValues: {
|
|
||||||
name: "Checklist",
|
|
||||||
cardPublicId,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const createChecklist = api.checklist.create.useMutation({
|
|
||||||
onMutate: async (args) => {
|
|
||||||
await utils.card.byId.cancel({ cardPublicId: args.cardPublicId });
|
|
||||||
const previous = utils.card.byId.getData({
|
|
||||||
cardPublicId: args.cardPublicId,
|
|
||||||
});
|
|
||||||
utils.card.byId.setData({ cardPublicId: args.cardPublicId }, (old) => {
|
|
||||||
if (!old) return old as any;
|
|
||||||
const placeholderChecklist = {
|
|
||||||
publicId: `PLACEHOLDER_${generateUID()}`,
|
|
||||||
name: args.name,
|
|
||||||
index: old.checklists.length,
|
|
||||||
items: [] as {
|
|
||||||
publicId: string;
|
|
||||||
title: string;
|
|
||||||
completed: boolean;
|
|
||||||
index: number;
|
|
||||||
}[],
|
|
||||||
};
|
|
||||||
return {
|
|
||||||
...old,
|
|
||||||
checklists: [...old.checklists, placeholderChecklist],
|
|
||||||
} as typeof old;
|
|
||||||
});
|
|
||||||
return { previous };
|
|
||||||
},
|
|
||||||
onSuccess: (data) => {
|
|
||||||
setModalState("ADD_CHECKLIST", { createdChecklistId: data.publicId });
|
|
||||||
},
|
|
||||||
onError: (_error, vars, ctx) => {
|
|
||||||
if (ctx?.previous)
|
|
||||||
utils.card.byId.setData(
|
|
||||||
{ cardPublicId: vars.cardPublicId },
|
|
||||||
ctx.previous,
|
|
||||||
);
|
|
||||||
showPopup({
|
|
||||||
header: t`Unable to create checklist`,
|
|
||||||
message: t`Please try again later, or contact customer support.`,
|
|
||||||
icon: "error",
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onSettled: async (_data, _error, vars) => {
|
|
||||||
await utils.card.byId.invalidate({ cardPublicId: vars.cardPublicId });
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const nameElement: HTMLElement | null =
|
|
||||||
document.querySelector<HTMLElement>("#checklist-name");
|
|
||||||
if (nameElement) nameElement.focus();
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const onSubmit = (data: NewChecklistFormInput) => {
|
|
||||||
closeModal();
|
|
||||||
reset({
|
|
||||||
name: "",
|
|
||||||
});
|
|
||||||
|
|
||||||
createChecklist.mutate({
|
|
||||||
name: data.name,
|
|
||||||
cardPublicId: data.cardPublicId,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<form onSubmit={handleSubmit(onSubmit)}>
|
|
||||||
<div className="px-5 pt-5">
|
|
||||||
<div className="flex w-full items-center justify-between pb-4">
|
|
||||||
<h2 className="text-sm font-bold text-neutral-900 dark:text-dark-1000">
|
|
||||||
{t`New checklist`}
|
|
||||||
</h2>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
className="rounded p-1 hover:bg-light-200 focus:outline-none dark:hover:bg-dark-300"
|
|
||||||
onClick={(e) => {
|
|
||||||
e.preventDefault();
|
|
||||||
closeModal();
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<HiXMark size={18} className="text-light-900 dark:text-dark-900" />
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<Input
|
|
||||||
id="checklist-name"
|
|
||||||
placeholder={t`Checklist name`}
|
|
||||||
{...register("name")}
|
|
||||||
onKeyDown={async (e) => {
|
|
||||||
if (e.key === "Enter") {
|
|
||||||
e.preventDefault();
|
|
||||||
await handleSubmit(onSubmit)();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="mt-12 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
|
|
||||||
<div>
|
|
||||||
<Button
|
|
||||||
type="submit"
|
|
||||||
disabled={createChecklist.isPending || !watch("name")}
|
|
||||||
>
|
|
||||||
{t`Create checklist`}
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,167 +0,0 @@
|
|||||||
import { t } from "@lingui/core/macro";
|
|
||||||
import { useEffect, useRef } from "react";
|
|
||||||
import ContentEditable from "react-contenteditable";
|
|
||||||
import { useForm } from "react-hook-form";
|
|
||||||
|
|
||||||
import { generateUID } from "@kan/shared/utils";
|
|
||||||
|
|
||||||
import { usePopup } from "~/providers/popup";
|
|
||||||
import { api } from "~/utils/api";
|
|
||||||
|
|
||||||
interface FormValues {
|
|
||||||
title: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface NewChecklistItemFormProps {
|
|
||||||
checklistPublicId: string;
|
|
||||||
cardPublicId: string;
|
|
||||||
onCancel: () => void;
|
|
||||||
readOnly?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
const NewChecklistItemForm = ({
|
|
||||||
checklistPublicId,
|
|
||||||
cardPublicId,
|
|
||||||
onCancel,
|
|
||||||
readOnly = false,
|
|
||||||
}: NewChecklistItemFormProps) => {
|
|
||||||
const utils = api.useUtils();
|
|
||||||
const { showPopup } = usePopup();
|
|
||||||
|
|
||||||
const { setValue, watch, reset, getValues } = useForm<FormValues>({
|
|
||||||
defaultValues: {
|
|
||||||
title: "",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const title = watch("title");
|
|
||||||
|
|
||||||
const editableRef = useRef<HTMLElement | null>(null);
|
|
||||||
const keepOpenRef = useRef(false);
|
|
||||||
|
|
||||||
const refocusEditable = () => {
|
|
||||||
const el = editableRef.current;
|
|
||||||
if (!el) return;
|
|
||||||
if (readOnly) return;
|
|
||||||
el.focus();
|
|
||||||
|
|
||||||
// hack to ensure the input is focused after creating new checklist item
|
|
||||||
setTimeout(() => {
|
|
||||||
el.focus();
|
|
||||||
}, 100);
|
|
||||||
};
|
|
||||||
|
|
||||||
const addChecklistItemMutation = api.checklist.createItem.useMutation({
|
|
||||||
onMutate: async (vars) => {
|
|
||||||
await utils.card.byId.cancel({ cardPublicId });
|
|
||||||
const previous = utils.card.byId.getData({ cardPublicId });
|
|
||||||
|
|
||||||
utils.card.byId.setData({ cardPublicId }, (old) => {
|
|
||||||
if (!old) return old as any;
|
|
||||||
const placeholder = {
|
|
||||||
publicId: `PLACEHOLDER_${generateUID()}`,
|
|
||||||
title: vars.title,
|
|
||||||
completed: false,
|
|
||||||
};
|
|
||||||
const updatedChecklists = old.checklists.map((cl) =>
|
|
||||||
cl.publicId === checklistPublicId
|
|
||||||
? { ...cl, items: [...cl.items, placeholder] }
|
|
||||||
: cl,
|
|
||||||
);
|
|
||||||
return { ...old, checklists: updatedChecklists } as typeof old;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (keepOpenRef.current) {
|
|
||||||
reset({ title: "" });
|
|
||||||
if (editableRef.current) editableRef.current.innerHTML = "";
|
|
||||||
refocusEditable();
|
|
||||||
} else {
|
|
||||||
onCancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
return { previous };
|
|
||||||
},
|
|
||||||
onError: (_err, _vars, ctx) => {
|
|
||||||
if (ctx?.previous)
|
|
||||||
utils.card.byId.setData({ cardPublicId }, ctx.previous);
|
|
||||||
showPopup({
|
|
||||||
header: t`Unable to add checklist item`,
|
|
||||||
message: t`Please try again later, or contact customer support.`,
|
|
||||||
icon: "error",
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onSettled: async () => {
|
|
||||||
await utils.card.byId.invalidate({ cardPublicId });
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const sanitizeHtmlToPlainText = (html: string): string => {
|
|
||||||
return html
|
|
||||||
.replace(/<br\s*\/?>(\n)?/gi, "\n")
|
|
||||||
.replace(/<div><br\s*\/?><\/div>/gi, "")
|
|
||||||
.replace(/<[^>]*>/g, "")
|
|
||||||
.replace(/ /g, " ")
|
|
||||||
.trim();
|
|
||||||
};
|
|
||||||
|
|
||||||
const submitIfNotEmpty = (keepOpen: boolean) => {
|
|
||||||
if (readOnly) return;
|
|
||||||
keepOpenRef.current = keepOpen;
|
|
||||||
const currentHtml = getValues("title") ?? "";
|
|
||||||
const plain = sanitizeHtmlToPlainText(currentHtml);
|
|
||||||
if (!plain) {
|
|
||||||
onCancel();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
addChecklistItemMutation.mutate({
|
|
||||||
checklistPublicId,
|
|
||||||
title: plain,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
refocusEditable();
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<form onSubmit={(e) => e.preventDefault()}>
|
|
||||||
<div className="group relative flex h-9 items-center gap-3 rounded-md pl-4 hover:bg-light-100 dark:hover:bg-dark-100">
|
|
||||||
<label className="relative inline-flex h-[16px] w-[16px] flex-shrink-0 cursor-default items-center justify-center">
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
disabled
|
|
||||||
className="peer h-[16px] w-[16px] appearance-none rounded-md border border-light-500 bg-transparent outline-none ring-0 hover:border-light-500 hover:bg-transparent focus:outline-none focus:ring-0 focus-visible:outline-none dark:border-dark-500 dark:hover:border-dark-500"
|
|
||||||
/>
|
|
||||||
</label>
|
|
||||||
<div className="flex-1 pr-7">
|
|
||||||
<ContentEditable
|
|
||||||
id={`checklist-item-input-${checklistPublicId}`}
|
|
||||||
tabIndex={readOnly ? -1 : 0}
|
|
||||||
placeholder={t`Add an item...`}
|
|
||||||
html={title}
|
|
||||||
disabled={readOnly}
|
|
||||||
onChange={(e) => setValue("title", e.target.value)}
|
|
||||||
className="m-0 min-h-[20px] w-full p-0 text-sm leading-5 text-light-900 outline-none focus-visible:outline-none dark:text-dark-950"
|
|
||||||
onBlur={() => submitIfNotEmpty(false)}
|
|
||||||
onKeyDown={async (e) => {
|
|
||||||
if (readOnly) return;
|
|
||||||
if (e.key === "Enter") {
|
|
||||||
e.preventDefault();
|
|
||||||
submitIfNotEmpty(true);
|
|
||||||
}
|
|
||||||
if (e.key === "Escape") {
|
|
||||||
e.preventDefault();
|
|
||||||
onCancel();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
innerRef={(el) => {
|
|
||||||
editableRef.current = (el as unknown as HTMLElement) ?? null;
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default NewChecklistItemForm;
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import { useEffect, useState } from "react";
|
|
||||||
import { useForm } from "react-hook-form";
|
import { useForm } from "react-hook-form";
|
||||||
import { IoChevronForwardSharp } from "react-icons/io5";
|
import { IoChevronForwardSharp } from "react-icons/io5";
|
||||||
|
|
||||||
@@ -20,15 +19,12 @@ import { api } from "~/utils/api";
|
|||||||
import { formatMemberDisplayName, getAvatarUrl } from "~/utils/helpers";
|
import { formatMemberDisplayName, getAvatarUrl } from "~/utils/helpers";
|
||||||
import { DeleteLabelConfirmation } from "../../components/DeleteLabelConfirmation";
|
import { DeleteLabelConfirmation } from "../../components/DeleteLabelConfirmation";
|
||||||
import ActivityList from "./components/ActivityList";
|
import ActivityList from "./components/ActivityList";
|
||||||
import Checklists from "./components/Checklists";
|
|
||||||
import { DeleteCardConfirmation } from "./components/DeleteCardConfirmation";
|
import { DeleteCardConfirmation } from "./components/DeleteCardConfirmation";
|
||||||
import { DeleteChecklistConfirmation } from "./components/DeleteChecklistConfirmation";
|
|
||||||
import { DeleteCommentConfirmation } from "./components/DeleteCommentConfirmation";
|
import { DeleteCommentConfirmation } from "./components/DeleteCommentConfirmation";
|
||||||
import Dropdown from "./components/Dropdown";
|
import Dropdown from "./components/Dropdown";
|
||||||
import LabelSelector from "./components/LabelSelector";
|
import LabelSelector from "./components/LabelSelector";
|
||||||
import ListSelector from "./components/ListSelector";
|
import ListSelector from "./components/ListSelector";
|
||||||
import MemberSelector from "./components/MemberSelector";
|
import MemberSelector from "./components/MemberSelector";
|
||||||
import { NewChecklistForm } from "./components/NewChecklistForm";
|
|
||||||
import NewCommentForm from "./components/NewCommentForm";
|
import NewCommentForm from "./components/NewCommentForm";
|
||||||
|
|
||||||
interface FormValues {
|
interface FormValues {
|
||||||
@@ -136,18 +132,9 @@ export function CardRightPanel() {
|
|||||||
export default function CardPage() {
|
export default function CardPage() {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const utils = api.useUtils();
|
const utils = api.useUtils();
|
||||||
const {
|
const { modalContentType, entityId } = useModal();
|
||||||
modalContentType,
|
|
||||||
entityId,
|
|
||||||
openModal,
|
|
||||||
getModalState,
|
|
||||||
clearModalState,
|
|
||||||
} = useModal();
|
|
||||||
const { showPopup } = usePopup();
|
const { showPopup } = usePopup();
|
||||||
const { workspace } = useWorkspace();
|
const { workspace } = useWorkspace();
|
||||||
const [activeChecklistForm, setActiveChecklistForm] = useState<string | null>(
|
|
||||||
null,
|
|
||||||
);
|
|
||||||
|
|
||||||
const cardId = Array.isArray(router.query.cardId)
|
const cardId = Array.isArray(router.query.cardId)
|
||||||
? router.query.cardId[0]
|
? router.query.cardId[0]
|
||||||
@@ -194,17 +181,6 @@ export default function CardPage() {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// Open the new item form after creating a new checklist
|
|
||||||
useEffect(() => {
|
|
||||||
if (!card) return;
|
|
||||||
const state = getModalState("ADD_CHECKLIST");
|
|
||||||
const createdId: string | undefined = state?.createdChecklistId;
|
|
||||||
if (createdId) {
|
|
||||||
setActiveChecklistForm(createdId);
|
|
||||||
clearModalState("ADD_CHECKLIST");
|
|
||||||
}
|
|
||||||
}, [card, getModalState, clearModalState]);
|
|
||||||
|
|
||||||
if (!cardId) return <></>;
|
if (!cardId) return <></>;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -212,96 +188,87 @@ export default function CardPage() {
|
|||||||
<PageHead
|
<PageHead
|
||||||
title={t`${card?.title ?? "Card"} | ${board?.name ?? "Board"}`}
|
title={t`${card?.title ?? "Card"} | ${board?.name ?? "Board"}`}
|
||||||
/>
|
/>
|
||||||
<div className="flex h-full flex-1 flex-row overflow-hidden">
|
<div className="flex h-full flex-1 flex-row">
|
||||||
<div className="scrollbar-thumb-rounded-[4px] scrollbar-track-rounded-[4px] w-full flex-1 overflow-y-auto scrollbar scrollbar-track-light-200 scrollbar-thumb-light-400 hover:scrollbar-thumb-light-400 dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-300 dark:hover:scrollbar-thumb-dark-300">
|
<div className="m-auto flex h-full w-full max-w-[800px] flex-col overflow-hidden">
|
||||||
<div className="p-auto mx-auto flex h-full w-full max-w-[800px] flex-col">
|
<div className="h-full max-h-[calc(100dvh-3rem)] overflow-y-auto p-6 md:max-h-[calc(100dvh-4rem)] md:p-8">
|
||||||
<div className="p-6 md:p-8">
|
<div className="mb-8 flex w-full items-center justify-between md:mt-6">
|
||||||
<div className="mb-8 flex w-full items-center justify-between md:mt-6">
|
{!card && isLoading && (
|
||||||
{!card && isLoading && (
|
<div className="flex space-x-2">
|
||||||
<div className="flex space-x-2">
|
<div className="h-[2.3rem] w-[150px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
|
||||||
<div className="h-[2.3rem] w-[150px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
|
<div className="h-[2.3rem] w-[300px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
|
||||||
<div className="h-[2.3rem] w-[300px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
|
</div>
|
||||||
</div>
|
)}
|
||||||
)}
|
|
||||||
{card && (
|
|
||||||
<>
|
|
||||||
<Link
|
|
||||||
className="whitespace-nowrap font-bold leading-[2.3rem] tracking-tight text-light-900 dark:text-dark-900 sm:text-[1.2rem]"
|
|
||||||
href={`/boards/${board?.publicId}`}
|
|
||||||
>
|
|
||||||
{board?.name}
|
|
||||||
</Link>
|
|
||||||
<IoChevronForwardSharp
|
|
||||||
size={18}
|
|
||||||
className="mx-2 text-light-900 dark:text-dark-900"
|
|
||||||
/>
|
|
||||||
<form
|
|
||||||
onSubmit={handleSubmit(onSubmit)}
|
|
||||||
className="w-full space-y-6"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
id="title"
|
|
||||||
{...register("title")}
|
|
||||||
onBlur={handleSubmit(onSubmit)}
|
|
||||||
className="block w-full border-0 bg-transparent p-0 py-0 font-bold tracking-tight text-neutral-900 focus:ring-0 dark:text-dark-1000 sm:text-[1.2rem]"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<div className="flex">
|
|
||||||
<Dropdown />
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
{!card && !isLoading && (
|
|
||||||
<p className="block p-0 py-0 font-bold leading-[2.3rem] tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
|
|
||||||
{t`Card not found`}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
{card && (
|
{card && (
|
||||||
<>
|
<>
|
||||||
<div className="mb-10 flex w-full max-w-2xl flex-col justify-between">
|
<Link
|
||||||
<form
|
className="whitespace-nowrap font-bold leading-[2.3rem] tracking-tight text-light-900 dark:text-dark-900 sm:text-[1.2rem]"
|
||||||
onSubmit={handleSubmit(onSubmit)}
|
href={`/boards/${board?.publicId}`}
|
||||||
className="w-full space-y-6"
|
>
|
||||||
>
|
{board?.name}
|
||||||
<div className="mt-2">
|
</Link>
|
||||||
<Editor
|
<IoChevronForwardSharp
|
||||||
content={card.description}
|
size={18}
|
||||||
onChange={(e) => setValue("description", e)}
|
className="mx-2 text-light-900 dark:text-dark-900"
|
||||||
onBlur={() => handleSubmit(onSubmit)()}
|
|
||||||
workspaceMembers={board?.workspace.members ?? []}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<Checklists
|
|
||||||
checklists={card.checklists}
|
|
||||||
cardPublicId={cardId}
|
|
||||||
activeChecklistForm={activeChecklistForm}
|
|
||||||
setActiveChecklistForm={setActiveChecklistForm}
|
|
||||||
/>
|
/>
|
||||||
<div className="border-t-[1px] border-light-300 pt-12 dark:border-dark-300">
|
<form
|
||||||
<h2 className="text-md pb-4 font-medium text-light-1000 dark:text-dark-1000">
|
onSubmit={handleSubmit(onSubmit)}
|
||||||
{t`Activity`}
|
className="w-full space-y-6"
|
||||||
</h2>
|
>
|
||||||
<div>
|
<div>
|
||||||
<ActivityList
|
<input
|
||||||
cardPublicId={cardId}
|
type="text"
|
||||||
activities={activities ?? []}
|
id="title"
|
||||||
isLoading={!card}
|
{...register("title")}
|
||||||
isAdmin={workspace.role === "admin"}
|
onBlur={handleSubmit(onSubmit)}
|
||||||
|
className="block w-full border-0 bg-transparent p-0 py-0 font-bold tracking-tight text-neutral-900 focus:ring-0 dark:text-dark-1000 sm:text-[1.2rem]"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-6">
|
</form>
|
||||||
<NewCommentForm cardPublicId={cardId} />
|
<div className="flex">
|
||||||
</div>
|
<Dropdown />
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
{!card && !isLoading && (
|
||||||
|
<p className="block p-0 py-0 font-bold leading-[2.3rem] tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
|
||||||
|
{t`Card not found`}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
{card && (
|
||||||
|
<>
|
||||||
|
<div className="mb-10 flex w-full max-w-2xl flex-col justify-between">
|
||||||
|
<form
|
||||||
|
onSubmit={handleSubmit(onSubmit)}
|
||||||
|
className="w-full space-y-6"
|
||||||
|
>
|
||||||
|
<div className="mt-2">
|
||||||
|
<Editor
|
||||||
|
content={card.description}
|
||||||
|
onChange={(e) => setValue("description", e)}
|
||||||
|
onBlur={() => handleSubmit(onSubmit)()}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div className="border-t-[1px] border-light-300 pt-12 dark:border-dark-300">
|
||||||
|
<h2 className="text-md pb-4 font-medium text-light-900 dark:text-dark-1000">
|
||||||
|
{t`Activity`}
|
||||||
|
</h2>
|
||||||
|
<div>
|
||||||
|
<ActivityList
|
||||||
|
cardPublicId={cardId}
|
||||||
|
activities={activities ?? []}
|
||||||
|
isLoading={!card}
|
||||||
|
isAdmin={workspace.role === "admin"}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="mt-6">
|
||||||
|
<NewCommentForm cardPublicId={cardId} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -336,15 +303,6 @@ export default function CardPage() {
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
|
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
|
||||||
{modalContentType === "ADD_CHECKLIST" && (
|
|
||||||
<NewChecklistForm cardPublicId={cardId} />
|
|
||||||
)}
|
|
||||||
{modalContentType === "DELETE_CHECKLIST" && (
|
|
||||||
<DeleteChecklistConfirmation
|
|
||||||
cardPublicId={cardId}
|
|
||||||
checklistPublicId={entityId}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</Modal>
|
</Modal>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import { useEffect, useRef, useState } from "react";
|
|
||||||
import { HiXMark } from "react-icons/hi2";
|
import { HiXMark } from "react-icons/hi2";
|
||||||
|
|
||||||
import Badge from "~/components/Badge";
|
import { authClient } from "@kan/auth/client";
|
||||||
|
|
||||||
import Editor from "~/components/Editor";
|
import Editor from "~/components/Editor";
|
||||||
import LabelIcon from "~/components/LabelIcon";
|
|
||||||
import { useModal } from "~/providers/modal";
|
import { useModal } from "~/providers/modal";
|
||||||
import { api } from "~/utils/api";
|
import { api } from "~/utils/api";
|
||||||
import ActivityList from "~/views/card/components/ActivityList";
|
import ActivityList from "~/views/card/components/ActivityList";
|
||||||
import Checklists from "~/views/card/components/Checklists";
|
|
||||||
|
|
||||||
export function CardModal({
|
export function CardModal({
|
||||||
cardPublicId,
|
cardPublicId,
|
||||||
@@ -22,9 +20,7 @@ export function CardModal({
|
|||||||
}) {
|
}) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { closeModal, isOpen } = useModal();
|
const { closeModal, isOpen } = useModal();
|
||||||
const [showFade, setShowFade] = useState(false);
|
const { data: session } = authClient.useSession();
|
||||||
const [showTopFade, setShowTopFade] = useState(false);
|
|
||||||
const scrollRef = useRef<HTMLDivElement>(null);
|
|
||||||
|
|
||||||
const { data, isLoading } = api.card.byId.useQuery(
|
const { data, isLoading } = api.card.byId.useQuery(
|
||||||
{
|
{
|
||||||
@@ -37,126 +33,85 @@ export function CardModal({
|
|||||||
|
|
||||||
const labels = data?.labels ?? [];
|
const labels = data?.labels ?? [];
|
||||||
|
|
||||||
const handleScroll = () => {
|
|
||||||
if (!scrollRef.current) return;
|
|
||||||
|
|
||||||
const { scrollTop, scrollHeight, clientHeight } = scrollRef.current;
|
|
||||||
const isAtBottom = scrollTop + clientHeight >= scrollHeight - 5;
|
|
||||||
const isAtTop = scrollTop <= 5;
|
|
||||||
|
|
||||||
setShowFade(!isAtBottom);
|
|
||||||
setShowTopFade(!isAtTop);
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const scrollElement = scrollRef.current;
|
|
||||||
if (!scrollElement) return;
|
|
||||||
|
|
||||||
handleScroll();
|
|
||||||
|
|
||||||
scrollElement.addEventListener("scroll", handleScroll);
|
|
||||||
return () => scrollElement.removeEventListener("scroll", handleScroll);
|
|
||||||
}, [data]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex h-full flex-1 flex-row">
|
<div className="flex h-full flex-1 flex-row">
|
||||||
<div className="flex h-full w-full flex-col overflow-hidden">
|
<div className="flex h-full w-full flex-col overflow-hidden">
|
||||||
<div className="h-full p-8">
|
<div className="h-full max-h-[calc(100vh-4rem)] overflow-y-auto p-8">
|
||||||
<div className="mb-6">
|
<div className="flex w-full items-center justify-between">
|
||||||
<div className="flex w-full items-center justify-between">
|
<button
|
||||||
<button
|
className="absolute right-[2rem] top-[2rem] rounded p-1 hover:bg-light-300 focus:outline-none dark:hover:bg-dark-300"
|
||||||
className="absolute right-[2rem] top-[2rem] rounded p-1 hover:bg-light-300 focus:outline-none dark:hover:bg-dark-300"
|
onClick={async (e) => {
|
||||||
onClick={async (e) => {
|
e.preventDefault();
|
||||||
e.preventDefault();
|
closeModal();
|
||||||
closeModal();
|
try {
|
||||||
try {
|
await router.replace(
|
||||||
await router.replace(
|
`/${workspaceSlug}/${boardSlug}`,
|
||||||
`/${workspaceSlug}/${boardSlug}`,
|
undefined,
|
||||||
undefined,
|
{
|
||||||
{
|
shallow: true,
|
||||||
shallow: true,
|
},
|
||||||
},
|
);
|
||||||
);
|
} catch (error) {
|
||||||
} catch (error) {
|
console.error(error);
|
||||||
console.error(error);
|
}
|
||||||
}
|
}}
|
||||||
}}
|
>
|
||||||
>
|
<HiXMark
|
||||||
<HiXMark
|
size={18}
|
||||||
size={18}
|
className="dark:text-dark-9000 text-light-900"
|
||||||
className="dark:text-dark-9000 text-light-900"
|
/>
|
||||||
/>
|
</button>
|
||||||
</button>
|
{isLoading ? (
|
||||||
{isLoading ? (
|
<div className="flex space-x-2">
|
||||||
<div className="flex space-x-2">
|
<div className="h-[2.3rem] w-[300px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
|
||||||
<div className="h-[2.3rem] w-[300px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<h1 className="pr-8 font-bold leading-[2.3rem] tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
|
|
||||||
{data?.title}
|
|
||||||
</h1>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
{labels.length > 0 && (
|
|
||||||
<div className="mt-2">
|
|
||||||
{labels.map((label) => (
|
|
||||||
<Badge
|
|
||||||
key={label.publicId}
|
|
||||||
value={label.name}
|
|
||||||
iconLeft={<LabelIcon colourCode={label.colourCode} />}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</div>
|
</div>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<h1 className="font-medium leading-[2.3rem] tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
|
||||||
|
{data?.title}
|
||||||
|
</h1>
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
<div className="mb-6">
|
||||||
|
{labels.map((label) => (
|
||||||
|
<div
|
||||||
|
key={label.publicId}
|
||||||
|
className="my-1 mr-1 inline-flex w-fit items-center gap-x-1.5 rounded-full px-2 py-1 text-[12px] font-medium text-light-800 ring-1 ring-inset ring-light-600 dark:text-dark-1000 dark:ring-dark-800"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
fill={label.colourCode ?? "#3730a3"}
|
||||||
|
className="h-2 w-2"
|
||||||
|
viewBox="0 0 6 6"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<circle cx={3} cy={3} r={3} />
|
||||||
|
</svg>
|
||||||
|
<div>{label.name}</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="relative">
|
{data?.description && (
|
||||||
<div
|
<div className="mb-10 flex w-full max-w-2xl justify-between">
|
||||||
ref={scrollRef}
|
<div className="mt-2">
|
||||||
className="h-full max-h-[425px] overflow-y-auto"
|
<Editor content={data.description} readOnly />
|
||||||
>
|
|
||||||
{data?.description && (
|
|
||||||
<div className="mb-10 flex w-full max-w-2xl justify-between">
|
|
||||||
<div className="mt-2">
|
|
||||||
<Editor
|
|
||||||
content={data.description}
|
|
||||||
readOnly
|
|
||||||
workspaceMembers={data?.list.board.workspace.members ?? []}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{data?.checklists && data.checklists.length > 0 && (
|
|
||||||
<Checklists
|
|
||||||
checklists={data.checklists}
|
|
||||||
cardPublicId={cardPublicId ?? ""}
|
|
||||||
viewOnly
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
<div className="border-t-[1px] border-light-600 pb-4 pt-12 dark:border-dark-400">
|
|
||||||
<h2 className="text-md pb-4 font-medium text-light-900 dark:text-dark-1000">
|
|
||||||
{t`Activity`}
|
|
||||||
</h2>
|
|
||||||
<div>
|
|
||||||
{cardPublicId && (
|
|
||||||
<ActivityList
|
|
||||||
cardPublicId={cardPublicId}
|
|
||||||
activities={data?.activities ?? []}
|
|
||||||
isLoading={isLoading}
|
|
||||||
isViewOnly={true}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{showTopFade && (
|
)}
|
||||||
<div className="pointer-events-none absolute left-0 right-0 top-0 h-6 bg-gradient-to-b from-white/80 to-transparent dark:from-dark-100/80" />
|
<div className="border-t-[1px] border-light-600 pb-4 pt-12 dark:border-dark-400">
|
||||||
)}
|
<h2 className="text-md pb-4 font-medium text-light-900 dark:text-dark-1000">
|
||||||
{showFade && (
|
{t`Activity`}
|
||||||
<div className="pointer-events-none absolute bottom-0 left-0 right-0 h-6 bg-gradient-to-t from-white/80 to-transparent dark:from-dark-100/80" />
|
</h2>
|
||||||
)}
|
<div>
|
||||||
|
{cardPublicId && (
|
||||||
|
<ActivityList
|
||||||
|
cardPublicId={cardPublicId}
|
||||||
|
activities={data?.activities ?? []}
|
||||||
|
isLoading={isLoading}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import Link from "next/link";
|
|||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import { keepPreviousData } from "@tanstack/react-query";
|
import { keepPreviousData } from "@tanstack/react-query";
|
||||||
import { env } from "next-runtime-env";
|
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { HiLink, HiOutlineLockClosed } from "react-icons/hi2";
|
import { HiLink, HiOutlineLockClosed } from "react-icons/hi2";
|
||||||
|
|
||||||
@@ -20,10 +19,6 @@ import Card from "~/views/board/components/Card";
|
|||||||
import Filters from "~/views/board/components/Filters";
|
import Filters from "~/views/board/components/Filters";
|
||||||
import { CardModal } from "./CardModal";
|
import { CardModal } from "./CardModal";
|
||||||
|
|
||||||
const IS_CLOUD = env("NEXT_PUBLIC_KAN_ENV") === "cloud";
|
|
||||||
const HIDE_POWERED_BY =
|
|
||||||
env("NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY") === "true";
|
|
||||||
|
|
||||||
export default function PublicBoardView() {
|
export default function PublicBoardView() {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { showPopup } = usePopup();
|
const { showPopup } = usePopup();
|
||||||
@@ -117,13 +112,7 @@ export default function PublicBoardView() {
|
|||||||
</h1>
|
</h1>
|
||||||
)}
|
)}
|
||||||
{data && (
|
{data && (
|
||||||
<div className="z-10 flex items-center space-x-2">
|
<div className="flex items-center space-x-2">
|
||||||
<div className="inline-flex cursor-default items-center justify-center whitespace-nowrap rounded-md border-[1px] border-light-300 bg-light-50 px-3 py-2 text-sm font-semibold text-light-950 shadow-sm dark:border-dark-300 dark:bg-dark-50 dark:text-dark-950">
|
|
||||||
<span className="mr-2">
|
|
||||||
<HiOutlineLockClosed />
|
|
||||||
</span>
|
|
||||||
{t`View only`}
|
|
||||||
</div>
|
|
||||||
<Filters
|
<Filters
|
||||||
labels={data.labels ?? []}
|
labels={data.labels ?? []}
|
||||||
members={[]}
|
members={[]}
|
||||||
@@ -180,7 +169,6 @@ export default function PublicBoardView() {
|
|||||||
<Card
|
<Card
|
||||||
title={card.title}
|
title={card.title}
|
||||||
labels={card.labels}
|
labels={card.labels}
|
||||||
checklists={card.checklists ?? []}
|
|
||||||
members={[]}
|
members={[]}
|
||||||
/>
|
/>
|
||||||
</Link>
|
</Link>
|
||||||
@@ -199,26 +187,12 @@ export default function PublicBoardView() {
|
|||||||
<CopyBoardLink />
|
<CopyBoardLink />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{IS_CLOUD && (
|
<Link
|
||||||
<Link
|
className="text-lg font-bold tracking-tight text-neutral-900 dark:text-dark-1000"
|
||||||
className="text-lg font-bold tracking-tight text-neutral-900 dark:text-dark-1000"
|
href="/"
|
||||||
href="/"
|
>
|
||||||
>
|
kan.bn
|
||||||
kan.bn
|
</Link>
|
||||||
</Link>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{!IS_CLOUD && !HIDE_POWERED_BY && (
|
|
||||||
<a
|
|
||||||
href="https://kan.bn"
|
|
||||||
target="_blank"
|
|
||||||
rel="noreferrer noopener"
|
|
||||||
className="absolute right-[1rem] inline-flex items-center gap-[0.175rem] rounded-full border border-light-300 bg-light-50 px-3 py-1 text-[11px] font-medium text-light-950 shadow-sm transition-colors hover:bg-light-100 dark:border-dark-300 dark:bg-dark-50 dark:text-dark-900 dark:hover:bg-dark-100"
|
|
||||||
>
|
|
||||||
<span>{`Powered by`}</span>
|
|
||||||
<span className="font-semibold">kan.bn</span>
|
|
||||||
</a>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<Popup />
|
<Popup />
|
||||||
|
|||||||
@@ -35,9 +35,6 @@ services:
|
|||||||
- NEXT_PUBLIC_AVATAR_BUCKET_NAME=${NEXT_PUBLIC_AVATAR_BUCKET_NAME}
|
- NEXT_PUBLIC_AVATAR_BUCKET_NAME=${NEXT_PUBLIC_AVATAR_BUCKET_NAME}
|
||||||
- NEXT_PUBLIC_STORAGE_DOMAIN=${NEXT_PUBLIC_STORAGE_DOMAIN}
|
- NEXT_PUBLIC_STORAGE_DOMAIN=${NEXT_PUBLIC_STORAGE_DOMAIN}
|
||||||
|
|
||||||
# White label
|
|
||||||
- NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY=${NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY}
|
|
||||||
|
|
||||||
# Auth config (optional)
|
# Auth config (optional)
|
||||||
- NEXT_PUBLIC_ALLOW_CREDENTIALS=${NEXT_PUBLIC_ALLOW_CREDENTIALS}
|
- NEXT_PUBLIC_ALLOW_CREDENTIALS=${NEXT_PUBLIC_ALLOW_CREDENTIALS}
|
||||||
- NEXT_PUBLIC_DISABLE_SIGN_UP=${NEXT_PUBLIC_DISABLE_SIGN_UP}
|
- NEXT_PUBLIC_DISABLE_SIGN_UP=${NEXT_PUBLIC_DISABLE_SIGN_UP}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { boardRouter } from "./routers/board";
|
import { boardRouter } from "./routers/board";
|
||||||
import { cardRouter } from "./routers/card";
|
import { cardRouter } from "./routers/card";
|
||||||
import { checklistRouter } from "./routers/checklist";
|
|
||||||
import { feedbackRouter } from "./routers/feedback";
|
import { feedbackRouter } from "./routers/feedback";
|
||||||
import { importRouter } from "./routers/import";
|
import { importRouter } from "./routers/import";
|
||||||
import { integrationRouter } from "./routers/integration";
|
import { integrationRouter } from "./routers/integration";
|
||||||
@@ -14,7 +13,6 @@ import { createTRPCRouter } from "./trpc";
|
|||||||
export const appRouter = createTRPCRouter({
|
export const appRouter = createTRPCRouter({
|
||||||
board: boardRouter,
|
board: boardRouter,
|
||||||
card: cardRouter,
|
card: cardRouter,
|
||||||
checklist: checklistRouter,
|
|
||||||
feedback: feedbackRouter,
|
feedback: feedbackRouter,
|
||||||
label: labelRouter,
|
label: labelRouter,
|
||||||
list: listRouter,
|
list: listRouter,
|
||||||
|
|||||||
@@ -1,410 +0,0 @@
|
|||||||
import { TRPCError } from "@trpc/server";
|
|
||||||
import { z } from "zod";
|
|
||||||
|
|
||||||
import * as cardRepo from "@kan/db/repository/card.repo";
|
|
||||||
import * as cardActivityRepo from "@kan/db/repository/cardActivity.repo";
|
|
||||||
import * as checklistRepo from "@kan/db/repository/checklist.repo";
|
|
||||||
|
|
||||||
import { createTRPCRouter, protectedProcedure } from "../trpc";
|
|
||||||
import { assertUserInWorkspace } from "../utils/auth";
|
|
||||||
|
|
||||||
const checklistSchema = z.object({
|
|
||||||
publicId: z.string().length(12),
|
|
||||||
name: z.string().min(1).max(255),
|
|
||||||
});
|
|
||||||
|
|
||||||
const checklistItemSchema = z.object({
|
|
||||||
publicId: z.string().length(12),
|
|
||||||
title: z.string().min(1).max(500),
|
|
||||||
completed: z.boolean(),
|
|
||||||
});
|
|
||||||
|
|
||||||
export const checklistRouter = createTRPCRouter({
|
|
||||||
create: protectedProcedure
|
|
||||||
.meta({
|
|
||||||
openapi: {
|
|
||||||
summary: "Add a checklist to a card",
|
|
||||||
method: "POST",
|
|
||||||
path: "/cards/{cardPublicId}/checklists",
|
|
||||||
description: "Adds a checklist to a card",
|
|
||||||
tags: ["Cards"],
|
|
||||||
protect: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.input(
|
|
||||||
z.object({
|
|
||||||
cardPublicId: z.string().length(12),
|
|
||||||
name: z.string().min(1).max(255),
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
.output(checklistSchema)
|
|
||||||
.mutation(async ({ ctx, input }) => {
|
|
||||||
const userId = ctx.user?.id;
|
|
||||||
|
|
||||||
if (!userId)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `User not authenticated`,
|
|
||||||
code: "UNAUTHORIZED",
|
|
||||||
});
|
|
||||||
|
|
||||||
const card = await cardRepo.getWorkspaceAndCardIdByCardPublicId(
|
|
||||||
ctx.db,
|
|
||||||
input.cardPublicId,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!card)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `Card with public ID ${input.cardPublicId} not found`,
|
|
||||||
code: "NOT_FOUND",
|
|
||||||
});
|
|
||||||
|
|
||||||
await assertUserInWorkspace(ctx.db, userId, card.workspaceId);
|
|
||||||
|
|
||||||
const newChecklist = await checklistRepo.create(ctx.db, {
|
|
||||||
name: input.name,
|
|
||||||
createdBy: userId,
|
|
||||||
cardId: card.id,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!newChecklist?.id)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `Failed to create checklist`,
|
|
||||||
code: "INTERNAL_SERVER_ERROR",
|
|
||||||
});
|
|
||||||
|
|
||||||
await cardActivityRepo.create(ctx.db, {
|
|
||||||
type: "card.updated.checklist.added",
|
|
||||||
cardId: card.id,
|
|
||||||
toTitle: newChecklist.name,
|
|
||||||
createdBy: userId,
|
|
||||||
});
|
|
||||||
|
|
||||||
return newChecklist;
|
|
||||||
}),
|
|
||||||
update: protectedProcedure
|
|
||||||
.input(
|
|
||||||
z.object({
|
|
||||||
checklistPublicId: z.string().length(12),
|
|
||||||
name: z.string().min(1).max(255),
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
.output(z.object({ publicId: z.string().length(12), name: z.string() }))
|
|
||||||
.mutation(async ({ ctx, input }) => {
|
|
||||||
const userId = ctx.user?.id;
|
|
||||||
if (!userId)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `User not authenticated`,
|
|
||||||
code: "UNAUTHORIZED",
|
|
||||||
});
|
|
||||||
|
|
||||||
const checklist = await checklistRepo.getChecklistByPublicId(
|
|
||||||
ctx.db,
|
|
||||||
input.checklistPublicId,
|
|
||||||
);
|
|
||||||
if (!checklist)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `Checklist with public ID ${input.checklistPublicId} not found`,
|
|
||||||
code: "NOT_FOUND",
|
|
||||||
});
|
|
||||||
|
|
||||||
await assertUserInWorkspace(
|
|
||||||
ctx.db,
|
|
||||||
userId,
|
|
||||||
checklist.card.list.board.workspace.id,
|
|
||||||
);
|
|
||||||
|
|
||||||
const previousName = checklist.name;
|
|
||||||
|
|
||||||
const updated = await checklistRepo.updateChecklistById(ctx.db, {
|
|
||||||
id: checklist.id,
|
|
||||||
name: input.name,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!updated)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `Failed to update checklist`,
|
|
||||||
code: "INTERNAL_SERVER_ERROR",
|
|
||||||
});
|
|
||||||
|
|
||||||
await cardActivityRepo.create(ctx.db, {
|
|
||||||
type: "card.updated.checklist.renamed",
|
|
||||||
cardId: checklist.cardId,
|
|
||||||
fromTitle: previousName,
|
|
||||||
toTitle: updated.name,
|
|
||||||
createdBy: userId,
|
|
||||||
});
|
|
||||||
|
|
||||||
return updated;
|
|
||||||
}),
|
|
||||||
delete: protectedProcedure
|
|
||||||
.meta({
|
|
||||||
openapi: {
|
|
||||||
summary: "Delete a checklist",
|
|
||||||
method: "DELETE",
|
|
||||||
path: "/checklists/{checklistPublicId}",
|
|
||||||
description: "Deletes a checklist by its public ID",
|
|
||||||
tags: ["Cards"],
|
|
||||||
protect: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.input(z.object({ checklistPublicId: z.string().length(12) }))
|
|
||||||
.output(z.object({ success: z.boolean() }))
|
|
||||||
.mutation(async ({ ctx, input }) => {
|
|
||||||
const userId = ctx.user?.id;
|
|
||||||
if (!userId)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `User not authenticated`,
|
|
||||||
code: "UNAUTHORIZED",
|
|
||||||
});
|
|
||||||
|
|
||||||
const checklist = await checklistRepo.getChecklistByPublicId(
|
|
||||||
ctx.db,
|
|
||||||
input.checklistPublicId,
|
|
||||||
);
|
|
||||||
if (!checklist)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `Checklist with public ID ${input.checklistPublicId} not found`,
|
|
||||||
code: "NOT_FOUND",
|
|
||||||
});
|
|
||||||
|
|
||||||
await assertUserInWorkspace(
|
|
||||||
ctx.db,
|
|
||||||
userId,
|
|
||||||
checklist.card.list.board.workspace.id,
|
|
||||||
);
|
|
||||||
|
|
||||||
await checklistRepo.softDeleteAllItemsByChecklistId(ctx.db, {
|
|
||||||
checklistId: checklist.id,
|
|
||||||
deletedAt: new Date(),
|
|
||||||
deletedBy: userId,
|
|
||||||
});
|
|
||||||
|
|
||||||
const deleted = await checklistRepo.softDeleteById(ctx.db, {
|
|
||||||
id: checklist.id,
|
|
||||||
deletedAt: new Date(),
|
|
||||||
deletedBy: userId,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!deleted)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `Failed to delete checklist`,
|
|
||||||
code: "INTERNAL_SERVER_ERROR",
|
|
||||||
});
|
|
||||||
|
|
||||||
await cardActivityRepo.create(ctx.db, {
|
|
||||||
type: "card.updated.checklist.deleted",
|
|
||||||
cardId: checklist.cardId,
|
|
||||||
fromTitle: checklist.name,
|
|
||||||
createdBy: userId,
|
|
||||||
});
|
|
||||||
|
|
||||||
return { success: true };
|
|
||||||
}),
|
|
||||||
createItem: protectedProcedure
|
|
||||||
.meta({
|
|
||||||
openapi: {
|
|
||||||
summary: "Add an item to a checklist",
|
|
||||||
method: "POST",
|
|
||||||
path: "/checklists/{checklistPublicId}/items",
|
|
||||||
description: "Adds an item to a checklist",
|
|
||||||
tags: ["Cards"],
|
|
||||||
protect: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.input(
|
|
||||||
z.object({
|
|
||||||
checklistPublicId: z.string().length(12),
|
|
||||||
title: z.string().min(1).max(500),
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
.output(checklistItemSchema)
|
|
||||||
.mutation(async ({ ctx, input }) => {
|
|
||||||
const userId = ctx.user?.id;
|
|
||||||
|
|
||||||
if (!userId)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `User not authenticated`,
|
|
||||||
code: "UNAUTHORIZED",
|
|
||||||
});
|
|
||||||
|
|
||||||
const checklist = await checklistRepo.getChecklistByPublicId(
|
|
||||||
ctx.db,
|
|
||||||
input.checklistPublicId,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!checklist)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `Checklist with public ID ${input.checklistPublicId} not found`,
|
|
||||||
code: "NOT_FOUND",
|
|
||||||
});
|
|
||||||
|
|
||||||
await assertUserInWorkspace(
|
|
||||||
ctx.db,
|
|
||||||
userId,
|
|
||||||
checklist.card.list.board.workspace.id,
|
|
||||||
);
|
|
||||||
|
|
||||||
const newChecklistItem = await checklistRepo.createItem(ctx.db, {
|
|
||||||
title: input.title,
|
|
||||||
createdBy: userId,
|
|
||||||
checklistId: checklist.id,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!newChecklistItem?.id)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `Failed to create checklist item`,
|
|
||||||
code: "INTERNAL_SERVER_ERROR",
|
|
||||||
});
|
|
||||||
|
|
||||||
await cardActivityRepo.create(ctx.db, {
|
|
||||||
type: "card.updated.checklist.item.added",
|
|
||||||
cardId: checklist.cardId,
|
|
||||||
toTitle: newChecklistItem.title,
|
|
||||||
createdBy: userId,
|
|
||||||
});
|
|
||||||
|
|
||||||
return newChecklistItem;
|
|
||||||
}),
|
|
||||||
updateItem: protectedProcedure
|
|
||||||
.meta({
|
|
||||||
openapi: {
|
|
||||||
summary: "Update a checklist item",
|
|
||||||
method: "PUT",
|
|
||||||
path: "/checklists/items/{checklistItemPublicId}",
|
|
||||||
description: "Updates a checklist item (title/completed)",
|
|
||||||
tags: ["Cards"],
|
|
||||||
protect: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.input(
|
|
||||||
z.object({
|
|
||||||
checklistItemPublicId: z.string().length(12),
|
|
||||||
title: z.string().min(1).max(500).optional(),
|
|
||||||
completed: z.boolean().optional(),
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
.output(checklistItemSchema)
|
|
||||||
.mutation(async ({ ctx, input }) => {
|
|
||||||
const userId = ctx.user?.id;
|
|
||||||
|
|
||||||
if (!userId)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `User not authenticated`,
|
|
||||||
code: "UNAUTHORIZED",
|
|
||||||
});
|
|
||||||
|
|
||||||
const item = await checklistRepo.getChecklistItemByPublicIdWithChecklist(
|
|
||||||
ctx.db,
|
|
||||||
input.checklistItemPublicId,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!item)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `Checklist item with public ID ${input.checklistItemPublicId} not found`,
|
|
||||||
code: "NOT_FOUND",
|
|
||||||
});
|
|
||||||
|
|
||||||
await assertUserInWorkspace(
|
|
||||||
ctx.db,
|
|
||||||
userId,
|
|
||||||
item.checklist.card.list.board.workspace.id,
|
|
||||||
);
|
|
||||||
|
|
||||||
const previousTitle = item.title;
|
|
||||||
|
|
||||||
const updated = await checklistRepo.updateItemById(ctx.db, {
|
|
||||||
id: item.id,
|
|
||||||
title: input.title,
|
|
||||||
completed: input.completed,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!updated)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `Failed to update checklist item`,
|
|
||||||
code: "INTERNAL_SERVER_ERROR",
|
|
||||||
});
|
|
||||||
|
|
||||||
// Log completion toggle
|
|
||||||
if (input.completed !== undefined) {
|
|
||||||
await cardActivityRepo.create(ctx.db, {
|
|
||||||
type: input.completed
|
|
||||||
? "card.updated.checklist.item.completed"
|
|
||||||
: "card.updated.checklist.item.uncompleted",
|
|
||||||
cardId: item.checklist.cardId,
|
|
||||||
toTitle: updated.title,
|
|
||||||
createdBy: userId,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Log title change
|
|
||||||
if (input.title !== undefined && input.title !== previousTitle) {
|
|
||||||
await cardActivityRepo.create(ctx.db, {
|
|
||||||
type: "card.updated.checklist.item.updated",
|
|
||||||
cardId: item.checklist.cardId,
|
|
||||||
fromTitle: previousTitle,
|
|
||||||
toTitle: updated.title,
|
|
||||||
createdBy: userId,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return updated;
|
|
||||||
}),
|
|
||||||
deleteItem: protectedProcedure
|
|
||||||
.meta({
|
|
||||||
openapi: {
|
|
||||||
summary: "Delete a checklist item",
|
|
||||||
method: "DELETE",
|
|
||||||
path: "/checklists/items/{checklistItemPublicId}",
|
|
||||||
description: "Deletes a checklist item",
|
|
||||||
tags: ["Cards"],
|
|
||||||
protect: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.input(z.object({ checklistItemPublicId: z.string().length(12) }))
|
|
||||||
.output(z.object({ success: z.boolean() }))
|
|
||||||
.mutation(async ({ ctx, input }) => {
|
|
||||||
const userId = ctx.user?.id;
|
|
||||||
if (!userId)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `User not authenticated`,
|
|
||||||
code: "UNAUTHORIZED",
|
|
||||||
});
|
|
||||||
|
|
||||||
const item = await checklistRepo.getChecklistItemByPublicIdWithChecklist(
|
|
||||||
ctx.db,
|
|
||||||
input.checklistItemPublicId,
|
|
||||||
);
|
|
||||||
if (!item)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `Checklist item with public ID ${input.checklistItemPublicId} not found`,
|
|
||||||
code: "NOT_FOUND",
|
|
||||||
});
|
|
||||||
|
|
||||||
await assertUserInWorkspace(
|
|
||||||
ctx.db,
|
|
||||||
userId,
|
|
||||||
item.checklist.card.list.board.workspace.id,
|
|
||||||
);
|
|
||||||
|
|
||||||
const deleted = await checklistRepo.softDeleteItemById(ctx.db, {
|
|
||||||
id: item.id,
|
|
||||||
deletedAt: new Date(),
|
|
||||||
deletedBy: userId,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!deleted)
|
|
||||||
throw new TRPCError({
|
|
||||||
message: `Failed to delete item`,
|
|
||||||
code: "INTERNAL_SERVER_ERROR",
|
|
||||||
});
|
|
||||||
|
|
||||||
await cardActivityRepo.create(ctx.db, {
|
|
||||||
type: "card.updated.checklist.item.deleted",
|
|
||||||
cardId: item.checklist.cardId,
|
|
||||||
fromTitle: item.title,
|
|
||||||
createdBy: userId,
|
|
||||||
});
|
|
||||||
|
|
||||||
return { success: true };
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";--> statement-breakpoint
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||||
|
|
||||||
CREATE TYPE "public"."board_visibility" AS ENUM('private', 'public');--> statement-breakpoint
|
CREATE TYPE "public"."board_visibility" AS ENUM('private', 'public');--> statement-breakpoint
|
||||||
CREATE TYPE "public"."card_activity_type" AS ENUM('card.created', 'card.updated.title', 'card.updated.description', 'card.updated.index', 'card.updated.list', 'card.updated.label.added', 'card.updated.label.removed', 'card.updated.member.added', 'card.updated.member.removed', 'card.updated.comment.added', 'card.updated.comment.updated', 'card.updated.comment.deleted', 'card.archived');--> statement-breakpoint
|
CREATE TYPE "public"."card_activity_type" AS ENUM('card.created', 'card.updated.title', 'card.updated.description', 'card.updated.index', 'card.updated.list', 'card.updated.label.added', 'card.updated.label.removed', 'card.updated.member.added', 'card.updated.member.removed', 'card.updated.comment.added', 'card.updated.comment.updated', 'card.updated.comment.deleted', 'card.archived');--> statement-breakpoint
|
||||||
|
|||||||
@@ -1,84 +0,0 @@
|
|||||||
CREATE TABLE IF NOT EXISTS "card_checklist_item" (
|
|
||||||
"id" bigserial PRIMARY KEY NOT NULL,
|
|
||||||
"publicId" varchar(12) NOT NULL,
|
|
||||||
"title" varchar(500) NOT NULL,
|
|
||||||
"completed" boolean DEFAULT false NOT NULL,
|
|
||||||
"index" integer NOT NULL,
|
|
||||||
"checklistId" bigint NOT NULL,
|
|
||||||
"createdBy" uuid,
|
|
||||||
"createdAt" timestamp DEFAULT now() NOT NULL,
|
|
||||||
"updatedAt" timestamp,
|
|
||||||
"deletedAt" timestamp,
|
|
||||||
"deletedBy" uuid,
|
|
||||||
CONSTRAINT "card_checklist_item_publicId_unique" UNIQUE("publicId")
|
|
||||||
);
|
|
||||||
--> statement-breakpoint
|
|
||||||
ALTER TABLE "card_checklist_item" ENABLE ROW LEVEL SECURITY;--> statement-breakpoint
|
|
||||||
CREATE TABLE IF NOT EXISTS "card_checklist" (
|
|
||||||
"id" bigserial PRIMARY KEY NOT NULL,
|
|
||||||
"publicId" varchar(12) NOT NULL,
|
|
||||||
"name" varchar(255) NOT NULL,
|
|
||||||
"index" integer NOT NULL,
|
|
||||||
"cardId" bigint NOT NULL,
|
|
||||||
"createdBy" uuid,
|
|
||||||
"createdAt" timestamp DEFAULT now() NOT NULL,
|
|
||||||
"updatedAt" timestamp,
|
|
||||||
"deletedAt" timestamp,
|
|
||||||
"deletedBy" uuid,
|
|
||||||
CONSTRAINT "card_checklist_publicId_unique" UNIQUE("publicId")
|
|
||||||
);
|
|
||||||
--> statement-breakpoint
|
|
||||||
ALTER TABLE "card_checklist" ENABLE ROW LEVEL SECURITY;--> statement-breakpoint
|
|
||||||
CREATE TABLE IF NOT EXISTS "integration" (
|
|
||||||
"provider" varchar(255) NOT NULL,
|
|
||||||
"userId" uuid NOT NULL,
|
|
||||||
"accessToken" varchar(255) NOT NULL,
|
|
||||||
"refreshToken" varchar(255),
|
|
||||||
"expiresAt" timestamp NOT NULL,
|
|
||||||
"createdAt" timestamp NOT NULL,
|
|
||||||
"updatedAt" timestamp,
|
|
||||||
CONSTRAINT "integration_pkey" PRIMARY KEY("userId","provider")
|
|
||||||
);
|
|
||||||
--> statement-breakpoint
|
|
||||||
ALTER TABLE "integration" ENABLE ROW LEVEL SECURITY;--> statement-breakpoint
|
|
||||||
DO $$ BEGIN
|
|
||||||
ALTER TABLE "card_checklist_item" ADD CONSTRAINT "card_checklist_item_checklistId_card_checklist_id_fk" FOREIGN KEY ("checklistId") REFERENCES "public"."card_checklist"("id") ON DELETE cascade ON UPDATE no action;
|
|
||||||
EXCEPTION
|
|
||||||
WHEN duplicate_object THEN null;
|
|
||||||
END $$;
|
|
||||||
--> statement-breakpoint
|
|
||||||
DO $$ BEGIN
|
|
||||||
ALTER TABLE "card_checklist_item" ADD CONSTRAINT "card_checklist_item_createdBy_user_id_fk" FOREIGN KEY ("createdBy") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;
|
|
||||||
EXCEPTION
|
|
||||||
WHEN duplicate_object THEN null;
|
|
||||||
END $$;
|
|
||||||
--> statement-breakpoint
|
|
||||||
DO $$ BEGIN
|
|
||||||
ALTER TABLE "card_checklist_item" ADD CONSTRAINT "card_checklist_item_deletedBy_user_id_fk" FOREIGN KEY ("deletedBy") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;
|
|
||||||
EXCEPTION
|
|
||||||
WHEN duplicate_object THEN null;
|
|
||||||
END $$;
|
|
||||||
--> statement-breakpoint
|
|
||||||
DO $$ BEGIN
|
|
||||||
ALTER TABLE "card_checklist" ADD CONSTRAINT "card_checklist_cardId_card_id_fk" FOREIGN KEY ("cardId") REFERENCES "public"."card"("id") ON DELETE cascade ON UPDATE no action;
|
|
||||||
EXCEPTION
|
|
||||||
WHEN duplicate_object THEN null;
|
|
||||||
END $$;
|
|
||||||
--> statement-breakpoint
|
|
||||||
DO $$ BEGIN
|
|
||||||
ALTER TABLE "card_checklist" ADD CONSTRAINT "card_checklist_createdBy_user_id_fk" FOREIGN KEY ("createdBy") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;
|
|
||||||
EXCEPTION
|
|
||||||
WHEN duplicate_object THEN null;
|
|
||||||
END $$;
|
|
||||||
--> statement-breakpoint
|
|
||||||
DO $$ BEGIN
|
|
||||||
ALTER TABLE "card_checklist" ADD CONSTRAINT "card_checklist_deletedBy_user_id_fk" FOREIGN KEY ("deletedBy") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;
|
|
||||||
EXCEPTION
|
|
||||||
WHEN duplicate_object THEN null;
|
|
||||||
END $$;
|
|
||||||
--> statement-breakpoint
|
|
||||||
DO $$ BEGIN
|
|
||||||
ALTER TABLE "integration" ADD CONSTRAINT "integration_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;
|
|
||||||
EXCEPTION
|
|
||||||
WHEN duplicate_object THEN null;
|
|
||||||
END $$;
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
ALTER TYPE "public"."card_activity_type" ADD VALUE 'card.updated.checklist.added' BEFORE 'card.archived';--> statement-breakpoint
|
|
||||||
ALTER TYPE "public"."card_activity_type" ADD VALUE 'card.updated.checklist.renamed' BEFORE 'card.archived';--> statement-breakpoint
|
|
||||||
ALTER TYPE "public"."card_activity_type" ADD VALUE 'card.updated.checklist.deleted' BEFORE 'card.archived';--> statement-breakpoint
|
|
||||||
ALTER TYPE "public"."card_activity_type" ADD VALUE 'card.updated.checklist.item.added' BEFORE 'card.archived';--> statement-breakpoint
|
|
||||||
ALTER TYPE "public"."card_activity_type" ADD VALUE 'card.updated.checklist.item.updated' BEFORE 'card.archived';--> statement-breakpoint
|
|
||||||
ALTER TYPE "public"."card_activity_type" ADD VALUE 'card.updated.checklist.item.completed' BEFORE 'card.archived';--> statement-breakpoint
|
|
||||||
ALTER TYPE "public"."card_activity_type" ADD VALUE 'card.updated.checklist.item.uncompleted' BEFORE 'card.archived';--> statement-breakpoint
|
|
||||||
ALTER TYPE "public"."card_activity_type" ADD VALUE 'card.updated.checklist.item.deleted' BEFORE 'card.archived';
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"id": "91f9a2fa-31e2-4f3a-bdb9-852292fd7501",
|
"id": "91f9a2fa-31e2-4f3a-bdb9-852292fd7501",
|
||||||
"prevId": "d170c8e0-bf75-4c71-abd9-0ecbeeb14003",
|
"prevId": "058e8521-2814-46f0-a33f-1bbd86f450ce",
|
||||||
"version": "7",
|
"version": "7",
|
||||||
"dialect": "postgresql",
|
"dialect": "postgresql",
|
||||||
"tables": {
|
"tables": {
|
||||||
@@ -92,9 +92,13 @@
|
|||||||
"account_userId_user_id_fk": {
|
"account_userId_user_id_fk": {
|
||||||
"name": "account_userId_user_id_fk",
|
"name": "account_userId_user_id_fk",
|
||||||
"tableFrom": "account",
|
"tableFrom": "account",
|
||||||
"columnsFrom": ["userId"],
|
"columnsFrom": [
|
||||||
|
"userId"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
}
|
}
|
||||||
@@ -241,9 +245,13 @@
|
|||||||
"apiKey_userId_user_id_fk": {
|
"apiKey_userId_user_id_fk": {
|
||||||
"name": "apiKey_userId_user_id_fk",
|
"name": "apiKey_userId_user_id_fk",
|
||||||
"tableFrom": "apiKey",
|
"tableFrom": "apiKey",
|
||||||
"columnsFrom": ["userId"],
|
"columnsFrom": [
|
||||||
|
"userId"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
}
|
}
|
||||||
@@ -312,9 +320,13 @@
|
|||||||
"session_userId_user_id_fk": {
|
"session_userId_user_id_fk": {
|
||||||
"name": "session_userId_user_id_fk",
|
"name": "session_userId_user_id_fk",
|
||||||
"tableFrom": "session",
|
"tableFrom": "session",
|
||||||
"columnsFrom": ["userId"],
|
"columnsFrom": [
|
||||||
|
"userId"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
}
|
}
|
||||||
@@ -323,7 +335,9 @@
|
|||||||
"uniqueConstraints": {
|
"uniqueConstraints": {
|
||||||
"session_token_unique": {
|
"session_token_unique": {
|
||||||
"name": "session_token_unique",
|
"name": "session_token_unique",
|
||||||
"columns": ["token"],
|
"columns": [
|
||||||
|
"token"
|
||||||
|
],
|
||||||
"nullsNotDistinct": false
|
"nullsNotDistinct": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -509,36 +523,52 @@
|
|||||||
"board_createdBy_user_id_fk": {
|
"board_createdBy_user_id_fk": {
|
||||||
"name": "board_createdBy_user_id_fk",
|
"name": "board_createdBy_user_id_fk",
|
||||||
"tableFrom": "board",
|
"tableFrom": "board",
|
||||||
"columnsFrom": ["createdBy"],
|
"columnsFrom": [
|
||||||
|
"createdBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
},
|
},
|
||||||
"board_deletedBy_user_id_fk": {
|
"board_deletedBy_user_id_fk": {
|
||||||
"name": "board_deletedBy_user_id_fk",
|
"name": "board_deletedBy_user_id_fk",
|
||||||
"tableFrom": "board",
|
"tableFrom": "board",
|
||||||
"columnsFrom": ["deletedBy"],
|
"columnsFrom": [
|
||||||
|
"deletedBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
},
|
},
|
||||||
"board_importId_import_id_fk": {
|
"board_importId_import_id_fk": {
|
||||||
"name": "board_importId_import_id_fk",
|
"name": "board_importId_import_id_fk",
|
||||||
"tableFrom": "board",
|
"tableFrom": "board",
|
||||||
"columnsFrom": ["importId"],
|
"columnsFrom": [
|
||||||
|
"importId"
|
||||||
|
],
|
||||||
"tableTo": "import",
|
"tableTo": "import",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "no action"
|
"onDelete": "no action"
|
||||||
},
|
},
|
||||||
"board_workspaceId_workspace_id_fk": {
|
"board_workspaceId_workspace_id_fk": {
|
||||||
"name": "board_workspaceId_workspace_id_fk",
|
"name": "board_workspaceId_workspace_id_fk",
|
||||||
"tableFrom": "board",
|
"tableFrom": "board",
|
||||||
"columnsFrom": ["workspaceId"],
|
"columnsFrom": [
|
||||||
|
"workspaceId"
|
||||||
|
],
|
||||||
"tableTo": "workspace",
|
"tableTo": "workspace",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
}
|
}
|
||||||
@@ -547,7 +577,9 @@
|
|||||||
"uniqueConstraints": {
|
"uniqueConstraints": {
|
||||||
"board_publicId_unique": {
|
"board_publicId_unique": {
|
||||||
"name": "board_publicId_unique",
|
"name": "board_publicId_unique",
|
||||||
"columns": ["publicId"],
|
"columns": [
|
||||||
|
"publicId"
|
||||||
|
],
|
||||||
"nullsNotDistinct": false
|
"nullsNotDistinct": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -681,63 +713,91 @@
|
|||||||
"card_activity_cardId_card_id_fk": {
|
"card_activity_cardId_card_id_fk": {
|
||||||
"name": "card_activity_cardId_card_id_fk",
|
"name": "card_activity_cardId_card_id_fk",
|
||||||
"tableFrom": "card_activity",
|
"tableFrom": "card_activity",
|
||||||
"columnsFrom": ["cardId"],
|
"columnsFrom": [
|
||||||
|
"cardId"
|
||||||
|
],
|
||||||
"tableTo": "card",
|
"tableTo": "card",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
},
|
},
|
||||||
"card_activity_fromListId_list_id_fk": {
|
"card_activity_fromListId_list_id_fk": {
|
||||||
"name": "card_activity_fromListId_list_id_fk",
|
"name": "card_activity_fromListId_list_id_fk",
|
||||||
"tableFrom": "card_activity",
|
"tableFrom": "card_activity",
|
||||||
"columnsFrom": ["fromListId"],
|
"columnsFrom": [
|
||||||
|
"fromListId"
|
||||||
|
],
|
||||||
"tableTo": "list",
|
"tableTo": "list",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
},
|
},
|
||||||
"card_activity_toListId_list_id_fk": {
|
"card_activity_toListId_list_id_fk": {
|
||||||
"name": "card_activity_toListId_list_id_fk",
|
"name": "card_activity_toListId_list_id_fk",
|
||||||
"tableFrom": "card_activity",
|
"tableFrom": "card_activity",
|
||||||
"columnsFrom": ["toListId"],
|
"columnsFrom": [
|
||||||
|
"toListId"
|
||||||
|
],
|
||||||
"tableTo": "list",
|
"tableTo": "list",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
},
|
},
|
||||||
"card_activity_labelId_label_id_fk": {
|
"card_activity_labelId_label_id_fk": {
|
||||||
"name": "card_activity_labelId_label_id_fk",
|
"name": "card_activity_labelId_label_id_fk",
|
||||||
"tableFrom": "card_activity",
|
"tableFrom": "card_activity",
|
||||||
"columnsFrom": ["labelId"],
|
"columnsFrom": [
|
||||||
|
"labelId"
|
||||||
|
],
|
||||||
"tableTo": "label",
|
"tableTo": "label",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
},
|
},
|
||||||
"card_activity_workspaceMemberId_workspace_members_id_fk": {
|
"card_activity_workspaceMemberId_workspace_members_id_fk": {
|
||||||
"name": "card_activity_workspaceMemberId_workspace_members_id_fk",
|
"name": "card_activity_workspaceMemberId_workspace_members_id_fk",
|
||||||
"tableFrom": "card_activity",
|
"tableFrom": "card_activity",
|
||||||
"columnsFrom": ["workspaceMemberId"],
|
"columnsFrom": [
|
||||||
|
"workspaceMemberId"
|
||||||
|
],
|
||||||
"tableTo": "workspace_members",
|
"tableTo": "workspace_members",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
},
|
},
|
||||||
"card_activity_createdBy_user_id_fk": {
|
"card_activity_createdBy_user_id_fk": {
|
||||||
"name": "card_activity_createdBy_user_id_fk",
|
"name": "card_activity_createdBy_user_id_fk",
|
||||||
"tableFrom": "card_activity",
|
"tableFrom": "card_activity",
|
||||||
"columnsFrom": ["createdBy"],
|
"columnsFrom": [
|
||||||
|
"createdBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
},
|
},
|
||||||
"card_activity_commentId_card_comments_id_fk": {
|
"card_activity_commentId_card_comments_id_fk": {
|
||||||
"name": "card_activity_commentId_card_comments_id_fk",
|
"name": "card_activity_commentId_card_comments_id_fk",
|
||||||
"tableFrom": "card_activity",
|
"tableFrom": "card_activity",
|
||||||
"columnsFrom": ["commentId"],
|
"columnsFrom": [
|
||||||
|
"commentId"
|
||||||
|
],
|
||||||
"tableTo": "card_comments",
|
"tableTo": "card_comments",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
}
|
}
|
||||||
@@ -746,7 +806,9 @@
|
|||||||
"uniqueConstraints": {
|
"uniqueConstraints": {
|
||||||
"card_activity_publicId_unique": {
|
"card_activity_publicId_unique": {
|
||||||
"name": "card_activity_publicId_unique",
|
"name": "card_activity_publicId_unique",
|
||||||
"columns": ["publicId"],
|
"columns": [
|
||||||
|
"publicId"
|
||||||
|
],
|
||||||
"nullsNotDistinct": false
|
"nullsNotDistinct": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -776,18 +838,26 @@
|
|||||||
"_card_workspace_members_cardId_card_id_fk": {
|
"_card_workspace_members_cardId_card_id_fk": {
|
||||||
"name": "_card_workspace_members_cardId_card_id_fk",
|
"name": "_card_workspace_members_cardId_card_id_fk",
|
||||||
"tableFrom": "_card_workspace_members",
|
"tableFrom": "_card_workspace_members",
|
||||||
"columnsFrom": ["cardId"],
|
"columnsFrom": [
|
||||||
|
"cardId"
|
||||||
|
],
|
||||||
"tableTo": "card",
|
"tableTo": "card",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
},
|
},
|
||||||
"_card_workspace_members_workspaceMemberId_workspace_members_id_fk": {
|
"_card_workspace_members_workspaceMemberId_workspace_members_id_fk": {
|
||||||
"name": "_card_workspace_members_workspaceMemberId_workspace_members_id_fk",
|
"name": "_card_workspace_members_workspaceMemberId_workspace_members_id_fk",
|
||||||
"tableFrom": "_card_workspace_members",
|
"tableFrom": "_card_workspace_members",
|
||||||
"columnsFrom": ["workspaceMemberId"],
|
"columnsFrom": [
|
||||||
|
"workspaceMemberId"
|
||||||
|
],
|
||||||
"tableTo": "workspace_members",
|
"tableTo": "workspace_members",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
}
|
}
|
||||||
@@ -795,7 +865,10 @@
|
|||||||
"compositePrimaryKeys": {
|
"compositePrimaryKeys": {
|
||||||
"_card_workspace_members_cardId_workspaceMemberId_pk": {
|
"_card_workspace_members_cardId_workspaceMemberId_pk": {
|
||||||
"name": "_card_workspace_members_cardId_workspaceMemberId_pk",
|
"name": "_card_workspace_members_cardId_workspaceMemberId_pk",
|
||||||
"columns": ["cardId", "workspaceMemberId"]
|
"columns": [
|
||||||
|
"cardId",
|
||||||
|
"workspaceMemberId"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"uniqueConstraints": {},
|
"uniqueConstraints": {},
|
||||||
@@ -886,36 +959,52 @@
|
|||||||
"card_createdBy_user_id_fk": {
|
"card_createdBy_user_id_fk": {
|
||||||
"name": "card_createdBy_user_id_fk",
|
"name": "card_createdBy_user_id_fk",
|
||||||
"tableFrom": "card",
|
"tableFrom": "card",
|
||||||
"columnsFrom": ["createdBy"],
|
"columnsFrom": [
|
||||||
|
"createdBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
},
|
},
|
||||||
"card_deletedBy_user_id_fk": {
|
"card_deletedBy_user_id_fk": {
|
||||||
"name": "card_deletedBy_user_id_fk",
|
"name": "card_deletedBy_user_id_fk",
|
||||||
"tableFrom": "card",
|
"tableFrom": "card",
|
||||||
"columnsFrom": ["deletedBy"],
|
"columnsFrom": [
|
||||||
|
"deletedBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
},
|
},
|
||||||
"card_listId_list_id_fk": {
|
"card_listId_list_id_fk": {
|
||||||
"name": "card_listId_list_id_fk",
|
"name": "card_listId_list_id_fk",
|
||||||
"tableFrom": "card",
|
"tableFrom": "card",
|
||||||
"columnsFrom": ["listId"],
|
"columnsFrom": [
|
||||||
|
"listId"
|
||||||
|
],
|
||||||
"tableTo": "list",
|
"tableTo": "list",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
},
|
},
|
||||||
"card_importId_import_id_fk": {
|
"card_importId_import_id_fk": {
|
||||||
"name": "card_importId_import_id_fk",
|
"name": "card_importId_import_id_fk",
|
||||||
"tableFrom": "card",
|
"tableFrom": "card",
|
||||||
"columnsFrom": ["importId"],
|
"columnsFrom": [
|
||||||
|
"importId"
|
||||||
|
],
|
||||||
"tableTo": "import",
|
"tableTo": "import",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "no action"
|
"onDelete": "no action"
|
||||||
}
|
}
|
||||||
@@ -924,7 +1013,9 @@
|
|||||||
"uniqueConstraints": {
|
"uniqueConstraints": {
|
||||||
"card_publicId_unique": {
|
"card_publicId_unique": {
|
||||||
"name": "card_publicId_unique",
|
"name": "card_publicId_unique",
|
||||||
"columns": ["publicId"],
|
"columns": [
|
||||||
|
"publicId"
|
||||||
|
],
|
||||||
"nullsNotDistinct": false
|
"nullsNotDistinct": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -954,18 +1045,26 @@
|
|||||||
"_card_labels_cardId_card_id_fk": {
|
"_card_labels_cardId_card_id_fk": {
|
||||||
"name": "_card_labels_cardId_card_id_fk",
|
"name": "_card_labels_cardId_card_id_fk",
|
||||||
"tableFrom": "_card_labels",
|
"tableFrom": "_card_labels",
|
||||||
"columnsFrom": ["cardId"],
|
"columnsFrom": [
|
||||||
|
"cardId"
|
||||||
|
],
|
||||||
"tableTo": "card",
|
"tableTo": "card",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
},
|
},
|
||||||
"_card_labels_labelId_label_id_fk": {
|
"_card_labels_labelId_label_id_fk": {
|
||||||
"name": "_card_labels_labelId_label_id_fk",
|
"name": "_card_labels_labelId_label_id_fk",
|
||||||
"tableFrom": "_card_labels",
|
"tableFrom": "_card_labels",
|
||||||
"columnsFrom": ["labelId"],
|
"columnsFrom": [
|
||||||
|
"labelId"
|
||||||
|
],
|
||||||
"tableTo": "label",
|
"tableTo": "label",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
}
|
}
|
||||||
@@ -973,7 +1072,10 @@
|
|||||||
"compositePrimaryKeys": {
|
"compositePrimaryKeys": {
|
||||||
"_card_labels_cardId_labelId_pk": {
|
"_card_labels_cardId_labelId_pk": {
|
||||||
"name": "_card_labels_cardId_labelId_pk",
|
"name": "_card_labels_cardId_labelId_pk",
|
||||||
"columns": ["cardId", "labelId"]
|
"columns": [
|
||||||
|
"cardId",
|
||||||
|
"labelId"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"uniqueConstraints": {},
|
"uniqueConstraints": {},
|
||||||
@@ -1046,27 +1148,39 @@
|
|||||||
"card_comments_cardId_card_id_fk": {
|
"card_comments_cardId_card_id_fk": {
|
||||||
"name": "card_comments_cardId_card_id_fk",
|
"name": "card_comments_cardId_card_id_fk",
|
||||||
"tableFrom": "card_comments",
|
"tableFrom": "card_comments",
|
||||||
"columnsFrom": ["cardId"],
|
"columnsFrom": [
|
||||||
|
"cardId"
|
||||||
|
],
|
||||||
"tableTo": "card",
|
"tableTo": "card",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
},
|
},
|
||||||
"card_comments_createdBy_user_id_fk": {
|
"card_comments_createdBy_user_id_fk": {
|
||||||
"name": "card_comments_createdBy_user_id_fk",
|
"name": "card_comments_createdBy_user_id_fk",
|
||||||
"tableFrom": "card_comments",
|
"tableFrom": "card_comments",
|
||||||
"columnsFrom": ["createdBy"],
|
"columnsFrom": [
|
||||||
|
"createdBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
},
|
},
|
||||||
"card_comments_deletedBy_user_id_fk": {
|
"card_comments_deletedBy_user_id_fk": {
|
||||||
"name": "card_comments_deletedBy_user_id_fk",
|
"name": "card_comments_deletedBy_user_id_fk",
|
||||||
"tableFrom": "card_comments",
|
"tableFrom": "card_comments",
|
||||||
"columnsFrom": ["deletedBy"],
|
"columnsFrom": [
|
||||||
|
"deletedBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
}
|
}
|
||||||
@@ -1075,7 +1189,9 @@
|
|||||||
"uniqueConstraints": {
|
"uniqueConstraints": {
|
||||||
"card_comments_publicId_unique": {
|
"card_comments_publicId_unique": {
|
||||||
"name": "card_comments_publicId_unique",
|
"name": "card_comments_publicId_unique",
|
||||||
"columns": ["publicId"],
|
"columns": [
|
||||||
|
"publicId"
|
||||||
|
],
|
||||||
"nullsNotDistinct": false
|
"nullsNotDistinct": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1137,9 +1253,13 @@
|
|||||||
"feedback_createdBy_user_id_fk": {
|
"feedback_createdBy_user_id_fk": {
|
||||||
"name": "feedback_createdBy_user_id_fk",
|
"name": "feedback_createdBy_user_id_fk",
|
||||||
"tableFrom": "feedback",
|
"tableFrom": "feedback",
|
||||||
"columnsFrom": ["createdBy"],
|
"columnsFrom": [
|
||||||
|
"createdBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
}
|
}
|
||||||
@@ -1199,9 +1319,13 @@
|
|||||||
"import_createdBy_user_id_fk": {
|
"import_createdBy_user_id_fk": {
|
||||||
"name": "import_createdBy_user_id_fk",
|
"name": "import_createdBy_user_id_fk",
|
||||||
"tableFrom": "import",
|
"tableFrom": "import",
|
||||||
"columnsFrom": ["createdBy"],
|
"columnsFrom": [
|
||||||
|
"createdBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
}
|
}
|
||||||
@@ -1210,7 +1334,9 @@
|
|||||||
"uniqueConstraints": {
|
"uniqueConstraints": {
|
||||||
"import_publicId_unique": {
|
"import_publicId_unique": {
|
||||||
"name": "import_publicId_unique",
|
"name": "import_publicId_unique",
|
||||||
"columns": ["publicId"],
|
"columns": [
|
||||||
|
"publicId"
|
||||||
|
],
|
||||||
"nullsNotDistinct": false
|
"nullsNotDistinct": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1295,36 +1421,52 @@
|
|||||||
"label_createdBy_user_id_fk": {
|
"label_createdBy_user_id_fk": {
|
||||||
"name": "label_createdBy_user_id_fk",
|
"name": "label_createdBy_user_id_fk",
|
||||||
"tableFrom": "label",
|
"tableFrom": "label",
|
||||||
"columnsFrom": ["createdBy"],
|
"columnsFrom": [
|
||||||
|
"createdBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
},
|
},
|
||||||
"label_boardId_board_id_fk": {
|
"label_boardId_board_id_fk": {
|
||||||
"name": "label_boardId_board_id_fk",
|
"name": "label_boardId_board_id_fk",
|
||||||
"tableFrom": "label",
|
"tableFrom": "label",
|
||||||
"columnsFrom": ["boardId"],
|
"columnsFrom": [
|
||||||
|
"boardId"
|
||||||
|
],
|
||||||
"tableTo": "board",
|
"tableTo": "board",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
},
|
},
|
||||||
"label_importId_import_id_fk": {
|
"label_importId_import_id_fk": {
|
||||||
"name": "label_importId_import_id_fk",
|
"name": "label_importId_import_id_fk",
|
||||||
"tableFrom": "label",
|
"tableFrom": "label",
|
||||||
"columnsFrom": ["importId"],
|
"columnsFrom": [
|
||||||
|
"importId"
|
||||||
|
],
|
||||||
"tableTo": "import",
|
"tableTo": "import",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "no action"
|
"onDelete": "no action"
|
||||||
},
|
},
|
||||||
"label_deletedBy_user_id_fk": {
|
"label_deletedBy_user_id_fk": {
|
||||||
"name": "label_deletedBy_user_id_fk",
|
"name": "label_deletedBy_user_id_fk",
|
||||||
"tableFrom": "label",
|
"tableFrom": "label",
|
||||||
"columnsFrom": ["deletedBy"],
|
"columnsFrom": [
|
||||||
|
"deletedBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
}
|
}
|
||||||
@@ -1333,7 +1475,9 @@
|
|||||||
"uniqueConstraints": {
|
"uniqueConstraints": {
|
||||||
"label_publicId_unique": {
|
"label_publicId_unique": {
|
||||||
"name": "label_publicId_unique",
|
"name": "label_publicId_unique",
|
||||||
"columns": ["publicId"],
|
"columns": [
|
||||||
|
"publicId"
|
||||||
|
],
|
||||||
"nullsNotDistinct": false
|
"nullsNotDistinct": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1418,36 +1562,52 @@
|
|||||||
"list_createdBy_user_id_fk": {
|
"list_createdBy_user_id_fk": {
|
||||||
"name": "list_createdBy_user_id_fk",
|
"name": "list_createdBy_user_id_fk",
|
||||||
"tableFrom": "list",
|
"tableFrom": "list",
|
||||||
"columnsFrom": ["createdBy"],
|
"columnsFrom": [
|
||||||
|
"createdBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
},
|
},
|
||||||
"list_deletedBy_user_id_fk": {
|
"list_deletedBy_user_id_fk": {
|
||||||
"name": "list_deletedBy_user_id_fk",
|
"name": "list_deletedBy_user_id_fk",
|
||||||
"tableFrom": "list",
|
"tableFrom": "list",
|
||||||
"columnsFrom": ["deletedBy"],
|
"columnsFrom": [
|
||||||
|
"deletedBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
},
|
},
|
||||||
"list_boardId_board_id_fk": {
|
"list_boardId_board_id_fk": {
|
||||||
"name": "list_boardId_board_id_fk",
|
"name": "list_boardId_board_id_fk",
|
||||||
"tableFrom": "list",
|
"tableFrom": "list",
|
||||||
"columnsFrom": ["boardId"],
|
"columnsFrom": [
|
||||||
|
"boardId"
|
||||||
|
],
|
||||||
"tableTo": "board",
|
"tableTo": "board",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
},
|
},
|
||||||
"list_importId_import_id_fk": {
|
"list_importId_import_id_fk": {
|
||||||
"name": "list_importId_import_id_fk",
|
"name": "list_importId_import_id_fk",
|
||||||
"tableFrom": "list",
|
"tableFrom": "list",
|
||||||
"columnsFrom": ["importId"],
|
"columnsFrom": [
|
||||||
|
"importId"
|
||||||
|
],
|
||||||
"tableTo": "import",
|
"tableTo": "import",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "no action"
|
"onDelete": "no action"
|
||||||
}
|
}
|
||||||
@@ -1456,7 +1616,9 @@
|
|||||||
"uniqueConstraints": {
|
"uniqueConstraints": {
|
||||||
"list_publicId_unique": {
|
"list_publicId_unique": {
|
||||||
"name": "list_publicId_unique",
|
"name": "list_publicId_unique",
|
||||||
"columns": ["publicId"],
|
"columns": [
|
||||||
|
"publicId"
|
||||||
|
],
|
||||||
"nullsNotDistinct": false
|
"nullsNotDistinct": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1526,7 +1688,9 @@
|
|||||||
"uniqueConstraints": {
|
"uniqueConstraints": {
|
||||||
"user_email_unique": {
|
"user_email_unique": {
|
||||||
"name": "user_email_unique",
|
"name": "user_email_unique",
|
||||||
"columns": ["email"],
|
"columns": [
|
||||||
|
"email"
|
||||||
|
],
|
||||||
"nullsNotDistinct": false
|
"nullsNotDistinct": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1558,7 +1722,9 @@
|
|||||||
"uniqueConstraints": {
|
"uniqueConstraints": {
|
||||||
"workspace_slugs_slug_unique": {
|
"workspace_slugs_slug_unique": {
|
||||||
"name": "workspace_slugs_slug_unique",
|
"name": "workspace_slugs_slug_unique",
|
||||||
"columns": ["slug"],
|
"columns": [
|
||||||
|
"slug"
|
||||||
|
],
|
||||||
"nullsNotDistinct": false
|
"nullsNotDistinct": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1652,27 +1818,39 @@
|
|||||||
"workspace_members_userId_user_id_fk": {
|
"workspace_members_userId_user_id_fk": {
|
||||||
"name": "workspace_members_userId_user_id_fk",
|
"name": "workspace_members_userId_user_id_fk",
|
||||||
"tableFrom": "workspace_members",
|
"tableFrom": "workspace_members",
|
||||||
"columnsFrom": ["userId"],
|
"columnsFrom": [
|
||||||
|
"userId"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
},
|
},
|
||||||
"workspace_members_workspaceId_workspace_id_fk": {
|
"workspace_members_workspaceId_workspace_id_fk": {
|
||||||
"name": "workspace_members_workspaceId_workspace_id_fk",
|
"name": "workspace_members_workspaceId_workspace_id_fk",
|
||||||
"tableFrom": "workspace_members",
|
"tableFrom": "workspace_members",
|
||||||
"columnsFrom": ["workspaceId"],
|
"columnsFrom": [
|
||||||
|
"workspaceId"
|
||||||
|
],
|
||||||
"tableTo": "workspace",
|
"tableTo": "workspace",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "cascade"
|
"onDelete": "cascade"
|
||||||
},
|
},
|
||||||
"workspace_members_deletedBy_user_id_fk": {
|
"workspace_members_deletedBy_user_id_fk": {
|
||||||
"name": "workspace_members_deletedBy_user_id_fk",
|
"name": "workspace_members_deletedBy_user_id_fk",
|
||||||
"tableFrom": "workspace_members",
|
"tableFrom": "workspace_members",
|
||||||
"columnsFrom": ["deletedBy"],
|
"columnsFrom": [
|
||||||
|
"deletedBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
}
|
}
|
||||||
@@ -1681,7 +1859,9 @@
|
|||||||
"uniqueConstraints": {
|
"uniqueConstraints": {
|
||||||
"workspace_members_publicId_unique": {
|
"workspace_members_publicId_unique": {
|
||||||
"name": "workspace_members_publicId_unique",
|
"name": "workspace_members_publicId_unique",
|
||||||
"columns": ["publicId"],
|
"columns": [
|
||||||
|
"publicId"
|
||||||
|
],
|
||||||
"nullsNotDistinct": false
|
"nullsNotDistinct": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1768,18 +1948,26 @@
|
|||||||
"workspace_createdBy_user_id_fk": {
|
"workspace_createdBy_user_id_fk": {
|
||||||
"name": "workspace_createdBy_user_id_fk",
|
"name": "workspace_createdBy_user_id_fk",
|
||||||
"tableFrom": "workspace",
|
"tableFrom": "workspace",
|
||||||
"columnsFrom": ["createdBy"],
|
"columnsFrom": [
|
||||||
|
"createdBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
},
|
},
|
||||||
"workspace_deletedBy_user_id_fk": {
|
"workspace_deletedBy_user_id_fk": {
|
||||||
"name": "workspace_deletedBy_user_id_fk",
|
"name": "workspace_deletedBy_user_id_fk",
|
||||||
"tableFrom": "workspace",
|
"tableFrom": "workspace",
|
||||||
"columnsFrom": ["deletedBy"],
|
"columnsFrom": [
|
||||||
|
"deletedBy"
|
||||||
|
],
|
||||||
"tableTo": "user",
|
"tableTo": "user",
|
||||||
"columnsTo": ["id"],
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"onUpdate": "no action",
|
"onUpdate": "no action",
|
||||||
"onDelete": "set null"
|
"onDelete": "set null"
|
||||||
}
|
}
|
||||||
@@ -1788,12 +1976,16 @@
|
|||||||
"uniqueConstraints": {
|
"uniqueConstraints": {
|
||||||
"workspace_publicId_unique": {
|
"workspace_publicId_unique": {
|
||||||
"name": "workspace_publicId_unique",
|
"name": "workspace_publicId_unique",
|
||||||
"columns": ["publicId"],
|
"columns": [
|
||||||
|
"publicId"
|
||||||
|
],
|
||||||
"nullsNotDistinct": false
|
"nullsNotDistinct": false
|
||||||
},
|
},
|
||||||
"workspace_slug_unique": {
|
"workspace_slug_unique": {
|
||||||
"name": "workspace_slug_unique",
|
"name": "workspace_slug_unique",
|
||||||
"columns": ["slug"],
|
"columns": [
|
||||||
|
"slug"
|
||||||
|
],
|
||||||
"nullsNotDistinct": false
|
"nullsNotDistinct": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1806,7 +1998,10 @@
|
|||||||
"public.board_visibility": {
|
"public.board_visibility": {
|
||||||
"name": "board_visibility",
|
"name": "board_visibility",
|
||||||
"schema": "public",
|
"schema": "public",
|
||||||
"values": ["private", "public"]
|
"values": [
|
||||||
|
"private",
|
||||||
|
"public"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"public.card_activity_type": {
|
"public.card_activity_type": {
|
||||||
"name": "card_activity_type",
|
"name": "card_activity_type",
|
||||||
@@ -1830,32 +2025,53 @@
|
|||||||
"public.source": {
|
"public.source": {
|
||||||
"name": "source",
|
"name": "source",
|
||||||
"schema": "public",
|
"schema": "public",
|
||||||
"values": ["trello"]
|
"values": [
|
||||||
|
"trello"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"public.status": {
|
"public.status": {
|
||||||
"name": "status",
|
"name": "status",
|
||||||
"schema": "public",
|
"schema": "public",
|
||||||
"values": ["started", "success", "failed"]
|
"values": [
|
||||||
|
"started",
|
||||||
|
"success",
|
||||||
|
"failed"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"public.role": {
|
"public.role": {
|
||||||
"name": "role",
|
"name": "role",
|
||||||
"schema": "public",
|
"schema": "public",
|
||||||
"values": ["admin", "member", "guest"]
|
"values": [
|
||||||
|
"admin",
|
||||||
|
"member",
|
||||||
|
"guest"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"public.member_status": {
|
"public.member_status": {
|
||||||
"name": "member_status",
|
"name": "member_status",
|
||||||
"schema": "public",
|
"schema": "public",
|
||||||
"values": ["invited", "active", "removed"]
|
"values": [
|
||||||
|
"invited",
|
||||||
|
"active",
|
||||||
|
"removed"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"public.slug_type": {
|
"public.slug_type": {
|
||||||
"name": "slug_type",
|
"name": "slug_type",
|
||||||
"schema": "public",
|
"schema": "public",
|
||||||
"values": ["reserved", "premium"]
|
"values": [
|
||||||
|
"reserved",
|
||||||
|
"premium"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"public.workspace_plan": {
|
"public.workspace_plan": {
|
||||||
"name": "workspace_plan",
|
"name": "workspace_plan",
|
||||||
"schema": "public",
|
"schema": "public",
|
||||||
"values": ["free", "pro", "enterprise"]
|
"values": [
|
||||||
|
"free",
|
||||||
|
"pro",
|
||||||
|
"enterprise"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"schemas": {},
|
"schemas": {},
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -50,20 +50,6 @@
|
|||||||
"when": 1749585889984,
|
"when": 1749585889984,
|
||||||
"tag": "20250610200449_ReaddIntegrationTable",
|
"tag": "20250610200449_ReaddIntegrationTable",
|
||||||
"breakpoints": true
|
"breakpoints": true
|
||||||
},
|
|
||||||
{
|
|
||||||
"idx": 7,
|
|
||||||
"version": "7",
|
|
||||||
"when": 1754511666265,
|
|
||||||
"tag": "20250806202106_glossy_luminals",
|
|
||||||
"breakpoints": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idx": 8,
|
|
||||||
"version": "7",
|
|
||||||
"when": 1755094668761,
|
|
||||||
"tag": "20250813141748_AddChecklistActivityTypes",
|
|
||||||
"breakpoints": true
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -39,7 +39,6 @@
|
|||||||
"with-env": "dotenv -e ../../.env --"
|
"with-env": "dotenv -e ../../.env --"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electric-sql/pglite": "^0.3.7",
|
|
||||||
"@kan/shared": "workspace:^",
|
"@kan/shared": "workspace:^",
|
||||||
"drizzle-orm": "^0.42.0",
|
"drizzle-orm": "^0.42.0",
|
||||||
"drizzle-zod": "^0.5.1",
|
"drizzle-zod": "^0.5.1",
|
||||||
|
|||||||
@@ -1,12 +1,8 @@
|
|||||||
import type { NodePgDatabase } from "drizzle-orm/node-postgres";
|
import type { NodePgDatabase } from "drizzle-orm/node-postgres";
|
||||||
import { drizzle as drizzlePgLite } from "drizzle-orm/pglite";
|
|
||||||
import { uuid_ossp } from "@electric-sql/pglite/contrib/uuid_ossp";
|
|
||||||
import { drizzle as drizzlePg } from "drizzle-orm/node-postgres";
|
import { drizzle as drizzlePg } from "drizzle-orm/node-postgres";
|
||||||
import { Pool } from "pg";
|
import { Pool } from "pg";
|
||||||
|
|
||||||
import * as schema from "./schema";
|
import * as schema from "./schema";
|
||||||
import { PGlite } from "@electric-sql/pglite";
|
|
||||||
import { migrate } from "drizzle-orm/pglite/migrator";
|
|
||||||
|
|
||||||
export type dbClient = NodePgDatabase<typeof schema> & {
|
export type dbClient = NodePgDatabase<typeof schema> & {
|
||||||
$client: Pool;
|
$client: Pool;
|
||||||
@@ -16,14 +12,7 @@ export const createDrizzleClient = (): dbClient => {
|
|||||||
const connectionString = process.env.POSTGRES_URL;
|
const connectionString = process.env.POSTGRES_URL;
|
||||||
|
|
||||||
if (!connectionString) {
|
if (!connectionString) {
|
||||||
console.log("POSTGRES_URL environment variable is not set, using PGLite");
|
throw new Error("POSTGRES_URL environment variable is not set");
|
||||||
|
|
||||||
const client = new PGlite({ dataDir: "./pgdata", extensions: { uuid_ossp }});
|
|
||||||
const db = drizzlePgLite(client, { schema });
|
|
||||||
|
|
||||||
migrate(db, { migrationsFolder: "../../packages/db/migrations" });
|
|
||||||
|
|
||||||
return db as unknown as dbClient;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const pool = new Pool({
|
const pool = new Pool({
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ import {
|
|||||||
cards,
|
cards,
|
||||||
cardsToLabels,
|
cardsToLabels,
|
||||||
cardToWorkspaceMembers,
|
cardToWorkspaceMembers,
|
||||||
checklistItems,
|
|
||||||
checklists,
|
|
||||||
labels,
|
labels,
|
||||||
lists,
|
lists,
|
||||||
workspaceMembers,
|
workspaceMembers,
|
||||||
@@ -166,27 +164,6 @@ export const getByPublicId = async (
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
checklists: {
|
|
||||||
columns: {
|
|
||||||
publicId: true,
|
|
||||||
name: true,
|
|
||||||
index: true,
|
|
||||||
},
|
|
||||||
where: isNull(checklists.deletedAt),
|
|
||||||
orderBy: asc(checklists.index),
|
|
||||||
with: {
|
|
||||||
items: {
|
|
||||||
columns: {
|
|
||||||
publicId: true,
|
|
||||||
title: true,
|
|
||||||
completed: true,
|
|
||||||
index: true,
|
|
||||||
},
|
|
||||||
where: isNull(checklistItems.deletedAt),
|
|
||||||
orderBy: asc(checklistItems.index),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
where: and(
|
where: and(
|
||||||
cardIds.length > 0 ? inArray(cards.publicId, cardIds) : undefined,
|
cardIds.length > 0 ? inArray(cards.publicId, cardIds) : undefined,
|
||||||
@@ -303,27 +280,6 @@ export const getBySlug = async (
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
checklists: {
|
|
||||||
columns: {
|
|
||||||
publicId: true,
|
|
||||||
name: true,
|
|
||||||
index: true,
|
|
||||||
},
|
|
||||||
where: isNull(checklists.deletedAt),
|
|
||||||
orderBy: asc(checklists.index),
|
|
||||||
with: {
|
|
||||||
items: {
|
|
||||||
columns: {
|
|
||||||
publicId: true,
|
|
||||||
title: true,
|
|
||||||
completed: true,
|
|
||||||
index: true,
|
|
||||||
},
|
|
||||||
where: isNull(checklistItems.deletedAt),
|
|
||||||
orderBy: asc(checklistItems.index),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
where: and(
|
where: and(
|
||||||
cardIds.length > 0 ? inArray(cards.publicId, cardIds) : undefined,
|
cardIds.length > 0 ? inArray(cards.publicId, cardIds) : undefined,
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ import {
|
|||||||
cards,
|
cards,
|
||||||
cardsToLabels,
|
cardsToLabels,
|
||||||
cardToWorkspaceMembers,
|
cardToWorkspaceMembers,
|
||||||
checklistItems,
|
|
||||||
checklists,
|
|
||||||
labels,
|
labels,
|
||||||
lists,
|
lists,
|
||||||
workspaceMembers,
|
workspaceMembers,
|
||||||
@@ -302,27 +300,6 @@ export const getWithListAndMembersByPublicId = async (
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
checklists: {
|
|
||||||
columns: {
|
|
||||||
publicId: true,
|
|
||||||
name: true,
|
|
||||||
index: true,
|
|
||||||
},
|
|
||||||
where: isNull(checklists.deletedAt),
|
|
||||||
orderBy: asc(checklists.index),
|
|
||||||
with: {
|
|
||||||
items: {
|
|
||||||
columns: {
|
|
||||||
publicId: true,
|
|
||||||
title: true,
|
|
||||||
completed: true,
|
|
||||||
index: true,
|
|
||||||
},
|
|
||||||
where: isNull(checklistItems.deletedAt),
|
|
||||||
orderBy: asc(checklistItems.index),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
list: {
|
list: {
|
||||||
columns: {
|
columns: {
|
||||||
publicId: true,
|
publicId: true,
|
||||||
|
|||||||
@@ -1,216 +0,0 @@
|
|||||||
import { and, desc, eq, isNull } from "drizzle-orm";
|
|
||||||
|
|
||||||
import type { dbClient } from "@kan/db/client";
|
|
||||||
import { checklistItems, checklists } from "@kan/db/schema";
|
|
||||||
import { generateUID } from "@kan/shared/utils";
|
|
||||||
|
|
||||||
export const create = async (
|
|
||||||
db: dbClient,
|
|
||||||
checklistInput: {
|
|
||||||
cardId: number;
|
|
||||||
name: string;
|
|
||||||
createdBy: string;
|
|
||||||
},
|
|
||||||
) => {
|
|
||||||
return db.transaction(async (tx) => {
|
|
||||||
const card = await tx.query.checklists.findFirst({
|
|
||||||
where: and(
|
|
||||||
eq(checklists.cardId, checklistInput.cardId),
|
|
||||||
isNull(checklists.deletedAt),
|
|
||||||
),
|
|
||||||
orderBy: desc(checklists.index),
|
|
||||||
});
|
|
||||||
|
|
||||||
const [result] = await tx
|
|
||||||
.insert(checklists)
|
|
||||||
.values({
|
|
||||||
publicId: generateUID(),
|
|
||||||
name: checklistInput.name,
|
|
||||||
createdBy: checklistInput.createdBy,
|
|
||||||
cardId: checklistInput.cardId,
|
|
||||||
index: card ? card.index + 1 : 0,
|
|
||||||
})
|
|
||||||
.returning({
|
|
||||||
id: checklists.id,
|
|
||||||
publicId: checklists.publicId,
|
|
||||||
name: checklists.name,
|
|
||||||
});
|
|
||||||
|
|
||||||
return result;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const createItem = async (
|
|
||||||
db: dbClient,
|
|
||||||
checklistItemInput: {
|
|
||||||
checklistId: number;
|
|
||||||
title: string;
|
|
||||||
createdBy: string;
|
|
||||||
},
|
|
||||||
) => {
|
|
||||||
return db.transaction(async (tx) => {
|
|
||||||
const lastItem = await tx.query.checklistItems.findFirst({
|
|
||||||
where: and(
|
|
||||||
eq(checklistItems.checklistId, checklistItemInput.checklistId),
|
|
||||||
isNull(checklistItems.deletedAt),
|
|
||||||
),
|
|
||||||
orderBy: desc(checklistItems.index),
|
|
||||||
});
|
|
||||||
|
|
||||||
const [result] = await tx
|
|
||||||
.insert(checklistItems)
|
|
||||||
.values({
|
|
||||||
publicId: generateUID(),
|
|
||||||
title: checklistItemInput.title,
|
|
||||||
createdBy: checklistItemInput.createdBy,
|
|
||||||
checklistId: checklistItemInput.checklistId,
|
|
||||||
index: lastItem ? lastItem.index + 1 : 0,
|
|
||||||
completed: false,
|
|
||||||
})
|
|
||||||
.returning({
|
|
||||||
id: checklistItems.id,
|
|
||||||
publicId: checklistItems.publicId,
|
|
||||||
title: checklistItems.title,
|
|
||||||
completed: checklistItems.completed,
|
|
||||||
});
|
|
||||||
|
|
||||||
return result;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getChecklistByPublicId = async (
|
|
||||||
db: dbClient,
|
|
||||||
checklistPublicId: string,
|
|
||||||
) => {
|
|
||||||
const checklist = await db.query.checklists.findFirst({
|
|
||||||
where: and(
|
|
||||||
eq(checklists.publicId, checklistPublicId),
|
|
||||||
isNull(checklists.deletedAt),
|
|
||||||
),
|
|
||||||
with: {
|
|
||||||
card: {
|
|
||||||
with: {
|
|
||||||
list: {
|
|
||||||
with: {
|
|
||||||
board: {
|
|
||||||
with: {
|
|
||||||
workspace: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return checklist;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getChecklistItemByPublicIdWithChecklist = async (
|
|
||||||
db: dbClient,
|
|
||||||
checklistItemPublicId: string,
|
|
||||||
) => {
|
|
||||||
const item = await db.query.checklistItems.findFirst({
|
|
||||||
where: and(
|
|
||||||
eq(checklistItems.publicId, checklistItemPublicId),
|
|
||||||
isNull(checklistItems.deletedAt),
|
|
||||||
),
|
|
||||||
with: {
|
|
||||||
checklist: {
|
|
||||||
with: {
|
|
||||||
card: {
|
|
||||||
with: {
|
|
||||||
list: {
|
|
||||||
with: {
|
|
||||||
board: {
|
|
||||||
with: { workspace: true },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return item;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const updateItemById = async (
|
|
||||||
db: dbClient,
|
|
||||||
args: { id: number; title?: string; completed?: boolean },
|
|
||||||
) => {
|
|
||||||
const [result] = await db
|
|
||||||
.update(checklistItems)
|
|
||||||
.set({
|
|
||||||
...(args.title !== undefined ? { title: args.title } : {}),
|
|
||||||
...(args.completed !== undefined ? { completed: args.completed } : {}),
|
|
||||||
updatedAt: new Date(),
|
|
||||||
})
|
|
||||||
.where(eq(checklistItems.id, args.id))
|
|
||||||
.returning({
|
|
||||||
publicId: checklistItems.publicId,
|
|
||||||
title: checklistItems.title,
|
|
||||||
completed: checklistItems.completed,
|
|
||||||
});
|
|
||||||
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const softDeleteItemById = async (
|
|
||||||
db: dbClient,
|
|
||||||
args: { id: number; deletedAt: Date; deletedBy: string },
|
|
||||||
) => {
|
|
||||||
const [result] = await db
|
|
||||||
.update(checklistItems)
|
|
||||||
.set({ deletedAt: args.deletedAt, deletedBy: args.deletedBy })
|
|
||||||
.where(eq(checklistItems.id, args.id))
|
|
||||||
.returning({ id: checklistItems.id });
|
|
||||||
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const softDeleteAllItemsByChecklistId = async (
|
|
||||||
db: dbClient,
|
|
||||||
args: { checklistId: number; deletedAt: Date; deletedBy: string },
|
|
||||||
) => {
|
|
||||||
const result = await db
|
|
||||||
.update(checklistItems)
|
|
||||||
.set({ deletedAt: args.deletedAt, deletedBy: args.deletedBy })
|
|
||||||
.where(
|
|
||||||
and(
|
|
||||||
eq(checklistItems.checklistId, args.checklistId),
|
|
||||||
isNull(checklistItems.deletedAt),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.returning({ id: checklistItems.id });
|
|
||||||
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const softDeleteById = async (
|
|
||||||
db: dbClient,
|
|
||||||
args: { id: number; deletedAt: Date; deletedBy: string },
|
|
||||||
) => {
|
|
||||||
const [result] = await db
|
|
||||||
.update(checklists)
|
|
||||||
.set({ deletedAt: args.deletedAt, deletedBy: args.deletedBy })
|
|
||||||
.where(eq(checklists.id, args.id))
|
|
||||||
.returning({ id: checklists.id });
|
|
||||||
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const updateChecklistById = async (
|
|
||||||
db: dbClient,
|
|
||||||
args: { id: number; name: string },
|
|
||||||
) => {
|
|
||||||
const [result] = await db
|
|
||||||
.update(checklists)
|
|
||||||
.set({ name: args.name, updatedAt: new Date() })
|
|
||||||
.where(eq(checklists.id, args.id))
|
|
||||||
.returning({ publicId: checklists.publicId, name: checklists.name });
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
@@ -12,7 +12,6 @@ import {
|
|||||||
varchar,
|
varchar,
|
||||||
} from "drizzle-orm/pg-core";
|
} from "drizzle-orm/pg-core";
|
||||||
|
|
||||||
import { checklists } from "./checklists";
|
|
||||||
import { imports } from "./imports";
|
import { imports } from "./imports";
|
||||||
import { labels } from "./labels";
|
import { labels } from "./labels";
|
||||||
import { lists } from "./lists";
|
import { lists } from "./lists";
|
||||||
@@ -32,15 +31,6 @@ export const activityTypes = [
|
|||||||
"card.updated.comment.added",
|
"card.updated.comment.added",
|
||||||
"card.updated.comment.updated",
|
"card.updated.comment.updated",
|
||||||
"card.updated.comment.deleted",
|
"card.updated.comment.deleted",
|
||||||
// Checklist activities
|
|
||||||
"card.updated.checklist.added",
|
|
||||||
"card.updated.checklist.renamed",
|
|
||||||
"card.updated.checklist.deleted",
|
|
||||||
"card.updated.checklist.item.added",
|
|
||||||
"card.updated.checklist.item.updated",
|
|
||||||
"card.updated.checklist.item.completed",
|
|
||||||
"card.updated.checklist.item.uncompleted",
|
|
||||||
"card.updated.checklist.item.deleted",
|
|
||||||
"card.archived",
|
"card.archived",
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
@@ -94,7 +84,6 @@ export const cardsRelations = relations(cards, ({ one, many }) => ({
|
|||||||
}),
|
}),
|
||||||
comments: many(comments),
|
comments: many(comments),
|
||||||
activities: many(cardActivities),
|
activities: many(cardActivities),
|
||||||
checklists: many(checklists),
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
export const cardActivities = pgTable("card_activity", {
|
export const cardActivities = pgTable("card_activity", {
|
||||||
|
|||||||
@@ -1,90 +0,0 @@
|
|||||||
import { relations } from "drizzle-orm";
|
|
||||||
import {
|
|
||||||
bigint,
|
|
||||||
bigserial,
|
|
||||||
boolean,
|
|
||||||
integer,
|
|
||||||
pgTable,
|
|
||||||
timestamp,
|
|
||||||
uuid,
|
|
||||||
varchar,
|
|
||||||
} from "drizzle-orm/pg-core";
|
|
||||||
|
|
||||||
import { cards } from "./cards";
|
|
||||||
import { users } from "./users";
|
|
||||||
|
|
||||||
export const checklists = pgTable("card_checklist", {
|
|
||||||
id: bigserial("id", { mode: "number" }).primaryKey(),
|
|
||||||
publicId: varchar("publicId", { length: 12 }).notNull().unique(),
|
|
||||||
name: varchar("name", { length: 255 }).notNull(),
|
|
||||||
index: integer("index").notNull(),
|
|
||||||
cardId: bigint("cardId", { mode: "number" })
|
|
||||||
.notNull()
|
|
||||||
.references(() => cards.id, { onDelete: "cascade" }),
|
|
||||||
createdBy: uuid("createdBy").references(() => users.id, {
|
|
||||||
onDelete: "set null",
|
|
||||||
}),
|
|
||||||
createdAt: timestamp("createdAt").defaultNow().notNull(),
|
|
||||||
updatedAt: timestamp("updatedAt"),
|
|
||||||
deletedAt: timestamp("deletedAt"),
|
|
||||||
deletedBy: uuid("deletedBy").references(() => users.id, {
|
|
||||||
onDelete: "set null",
|
|
||||||
}),
|
|
||||||
}).enableRLS();
|
|
||||||
|
|
||||||
export const checklistsRelations = relations(checklists, ({ one, many }) => ({
|
|
||||||
card: one(cards, {
|
|
||||||
fields: [checklists.cardId],
|
|
||||||
references: [cards.id],
|
|
||||||
relationName: "checklistsCard",
|
|
||||||
}),
|
|
||||||
createdBy: one(users, {
|
|
||||||
fields: [checklists.createdBy],
|
|
||||||
references: [users.id],
|
|
||||||
relationName: "checklistsCreatedByUser",
|
|
||||||
}),
|
|
||||||
deletedBy: one(users, {
|
|
||||||
fields: [checklists.deletedBy],
|
|
||||||
references: [users.id],
|
|
||||||
relationName: "checklistsDeletedByUser",
|
|
||||||
}),
|
|
||||||
items: many(checklistItems),
|
|
||||||
}));
|
|
||||||
|
|
||||||
export const checklistItems = pgTable("card_checklist_item", {
|
|
||||||
id: bigserial("id", { mode: "number" }).primaryKey(),
|
|
||||||
publicId: varchar("publicId", { length: 12 }).notNull().unique(),
|
|
||||||
title: varchar("title", { length: 500 }).notNull(),
|
|
||||||
completed: boolean("completed").notNull().default(false),
|
|
||||||
index: integer("index").notNull(),
|
|
||||||
checklistId: bigint("checklistId", { mode: "number" })
|
|
||||||
.notNull()
|
|
||||||
.references(() => checklists.id, { onDelete: "cascade" }),
|
|
||||||
createdBy: uuid("createdBy").references(() => users.id, {
|
|
||||||
onDelete: "set null",
|
|
||||||
}),
|
|
||||||
createdAt: timestamp("createdAt").defaultNow().notNull(),
|
|
||||||
updatedAt: timestamp("updatedAt"),
|
|
||||||
deletedAt: timestamp("deletedAt"),
|
|
||||||
deletedBy: uuid("deletedBy").references(() => users.id, {
|
|
||||||
onDelete: "set null",
|
|
||||||
}),
|
|
||||||
}).enableRLS();
|
|
||||||
|
|
||||||
export const checklistItemsRelations = relations(checklistItems, ({ one }) => ({
|
|
||||||
checklist: one(checklists, {
|
|
||||||
fields: [checklistItems.checklistId],
|
|
||||||
references: [checklists.id],
|
|
||||||
relationName: "checklistItemsChecklist",
|
|
||||||
}),
|
|
||||||
createdBy: one(users, {
|
|
||||||
fields: [checklistItems.createdBy],
|
|
||||||
references: [users.id],
|
|
||||||
relationName: "checklistItemsCreatedByUser",
|
|
||||||
}),
|
|
||||||
deletedBy: one(users, {
|
|
||||||
fields: [checklistItems.deletedBy],
|
|
||||||
references: [users.id],
|
|
||||||
relationName: "checklistItemsDeletedByUser",
|
|
||||||
}),
|
|
||||||
}));
|
|
||||||
@@ -2,7 +2,6 @@ export * from "./auth";
|
|||||||
export * from "./boards";
|
export * from "./boards";
|
||||||
export * from "./auth";
|
export * from "./auth";
|
||||||
export * from "./cards";
|
export * from "./cards";
|
||||||
export * from "./checklists";
|
|
||||||
export * from "./feedback";
|
export * from "./feedback";
|
||||||
export * from "./imports";
|
export * from "./imports";
|
||||||
export * from "./labels";
|
export * from "./labels";
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
import Plunk from "@plunk/node";
|
import Plunk from "@plunk/node";
|
||||||
|
|
||||||
export const cloudMailerClient =
|
export const cloudMailerClient =
|
||||||
process.env.NEXT_PUBLIC_KAN_ENV === "cloud" &&
|
process.env.NEXT_PUBLIC_KAN_ENV === "cloud"
|
||||||
process.env.PLUNK_API_KEY &&
|
|
||||||
process.env.PLUNK_API_URL
|
|
||||||
? new Plunk(process.env.PLUNK_API_KEY ?? "", {
|
? new Plunk(process.env.PLUNK_API_KEY ?? "", {
|
||||||
baseUrl: process.env.PLUNK_API_URL,
|
baseUrl: process.env.PLUNK_API_URL,
|
||||||
})
|
})
|
||||||
|
|||||||
36
pnpm-lock.yaml
generated
36
pnpm-lock.yaml
generated
@@ -123,9 +123,6 @@ importers:
|
|||||||
'@tiptap/extension-link':
|
'@tiptap/extension-link':
|
||||||
specifier: ^2.22.2
|
specifier: ^2.22.2
|
||||||
version: 2.22.2(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)
|
version: 2.22.2(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)
|
||||||
'@tiptap/extension-mention':
|
|
||||||
specifier: ^3.0.9
|
|
||||||
version: 3.0.9(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(@tiptap/suggestion@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0))
|
|
||||||
'@tiptap/extension-placeholder':
|
'@tiptap/extension-placeholder':
|
||||||
specifier: ^2.14.0
|
specifier: ^2.14.0
|
||||||
version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)
|
version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)
|
||||||
@@ -363,18 +360,15 @@ importers:
|
|||||||
|
|
||||||
packages/db:
|
packages/db:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@electric-sql/pglite':
|
|
||||||
specifier: ^0.3.7
|
|
||||||
version: 0.3.7
|
|
||||||
'@kan/shared':
|
'@kan/shared':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../shared
|
version: link:../shared
|
||||||
drizzle-orm:
|
drizzle-orm:
|
||||||
specifier: ^0.42.0
|
specifier: ^0.42.0
|
||||||
version: 0.42.0(@electric-sql/pglite@0.3.7)(@neondatabase/serverless@0.10.4)(@types/pg@8.11.6)(@vercel/postgres@0.10.0(utf-8-validate@6.0.3))(kysely@0.28.2)(pg@8.13.1)(postgres@3.4.5)
|
version: 0.42.0(@neondatabase/serverless@0.10.4)(@types/pg@8.11.6)(@vercel/postgres@0.10.0(utf-8-validate@6.0.3))(kysely@0.28.2)(pg@8.13.1)(postgres@3.4.5)
|
||||||
drizzle-zod:
|
drizzle-zod:
|
||||||
specifier: ^0.5.1
|
specifier: ^0.5.1
|
||||||
version: 0.5.1(drizzle-orm@0.42.0(@electric-sql/pglite@0.3.7)(@neondatabase/serverless@0.10.4)(@types/pg@8.11.6)(@vercel/postgres@0.10.0(utf-8-validate@6.0.3))(kysely@0.28.2)(pg@8.13.1)(postgres@3.4.5))(zod@3.24.0)
|
version: 0.5.1(drizzle-orm@0.42.0(@neondatabase/serverless@0.10.4)(@types/pg@8.11.6)(@vercel/postgres@0.10.0(utf-8-validate@6.0.3))(kysely@0.28.2)(pg@8.13.1)(postgres@3.4.5))(zod@3.24.0)
|
||||||
pg:
|
pg:
|
||||||
specifier: ^8.11.3
|
specifier: ^8.11.3
|
||||||
version: 8.13.1
|
version: 8.13.1
|
||||||
@@ -894,9 +888,6 @@ packages:
|
|||||||
'@drizzle-team/brocli@0.10.2':
|
'@drizzle-team/brocli@0.10.2':
|
||||||
resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
|
resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
|
||||||
|
|
||||||
'@electric-sql/pglite@0.3.7':
|
|
||||||
resolution: {integrity: sha512-5c3mybVrhxu5s47zFZtIGdG8YHkKCBENOmqxnNBjY53ZoDhADY/c5UqBDl159b7qtkzNPtbbb893wL9zi1kAuw==}
|
|
||||||
|
|
||||||
'@emnapi/runtime@1.3.1':
|
'@emnapi/runtime@1.3.1':
|
||||||
resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
|
resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
|
||||||
|
|
||||||
@@ -2779,13 +2770,6 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@tiptap/core': ^2.7.0
|
'@tiptap/core': ^2.7.0
|
||||||
|
|
||||||
'@tiptap/extension-mention@3.0.9':
|
|
||||||
resolution: {integrity: sha512-DTQNAQkHZ+7Enlt3KvjqN6eECINlqPpET4Drzwj8Mmz9kMILc87cz3G2cwEKRrS9A1Xn3H3VpWvElWE2Wq9JHw==}
|
|
||||||
peerDependencies:
|
|
||||||
'@tiptap/core': ^3.0.9
|
|
||||||
'@tiptap/pm': ^3.0.9
|
|
||||||
'@tiptap/suggestion': ^3.0.9
|
|
||||||
|
|
||||||
'@tiptap/extension-ordered-list@2.14.0':
|
'@tiptap/extension-ordered-list@2.14.0':
|
||||||
resolution: {integrity: sha512-QUZcyuW9AKvSfpFHcGmbyRCqxcpY0VNf0xipEtogxbA+JDDw3ZSPqU1dUgz9wk00RahPTwNDdY5aVjdQ5N4N9Q==}
|
resolution: {integrity: sha512-QUZcyuW9AKvSfpFHcGmbyRCqxcpY0VNf0xipEtogxbA+JDDw3ZSPqU1dUgz9wk00RahPTwNDdY5aVjdQ5N4N9Q==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -6500,7 +6484,6 @@ packages:
|
|||||||
source-map@0.8.0-beta.0:
|
source-map@0.8.0-beta.0:
|
||||||
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
|
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
deprecated: The work that was done in this beta branch won't be included in future versions
|
|
||||||
|
|
||||||
space-separated-tokens@2.0.2:
|
space-separated-tokens@2.0.2:
|
||||||
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
|
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
|
||||||
@@ -7869,8 +7852,6 @@ snapshots:
|
|||||||
|
|
||||||
'@drizzle-team/brocli@0.10.2': {}
|
'@drizzle-team/brocli@0.10.2': {}
|
||||||
|
|
||||||
'@electric-sql/pglite@0.3.7': {}
|
|
||||||
|
|
||||||
'@emnapi/runtime@1.3.1':
|
'@emnapi/runtime@1.3.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
@@ -9631,12 +9612,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@tiptap/core': 2.14.0(@tiptap/pm@2.14.0)
|
'@tiptap/core': 2.14.0(@tiptap/pm@2.14.0)
|
||||||
|
|
||||||
'@tiptap/extension-mention@3.0.9(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(@tiptap/suggestion@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0))':
|
|
||||||
dependencies:
|
|
||||||
'@tiptap/core': 2.14.0(@tiptap/pm@2.14.0)
|
|
||||||
'@tiptap/pm': 2.14.0
|
|
||||||
'@tiptap/suggestion': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)
|
|
||||||
|
|
||||||
'@tiptap/extension-ordered-list@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))':
|
'@tiptap/extension-ordered-list@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@tiptap/core': 2.14.0(@tiptap/pm@2.14.0)
|
'@tiptap/core': 2.14.0(@tiptap/pm@2.14.0)
|
||||||
@@ -10870,9 +10845,8 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
drizzle-orm@0.42.0(@electric-sql/pglite@0.3.7)(@neondatabase/serverless@0.10.4)(@types/pg@8.11.6)(@vercel/postgres@0.10.0(utf-8-validate@6.0.3))(kysely@0.28.2)(pg@8.13.1)(postgres@3.4.5):
|
drizzle-orm@0.42.0(@neondatabase/serverless@0.10.4)(@types/pg@8.11.6)(@vercel/postgres@0.10.0(utf-8-validate@6.0.3))(kysely@0.28.2)(pg@8.13.1)(postgres@3.4.5):
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@electric-sql/pglite': 0.3.7
|
|
||||||
'@neondatabase/serverless': 0.10.4
|
'@neondatabase/serverless': 0.10.4
|
||||||
'@types/pg': 8.11.6
|
'@types/pg': 8.11.6
|
||||||
'@vercel/postgres': 0.10.0(utf-8-validate@6.0.3)
|
'@vercel/postgres': 0.10.0(utf-8-validate@6.0.3)
|
||||||
@@ -10880,9 +10854,9 @@ snapshots:
|
|||||||
pg: 8.13.1
|
pg: 8.13.1
|
||||||
postgres: 3.4.5
|
postgres: 3.4.5
|
||||||
|
|
||||||
drizzle-zod@0.5.1(drizzle-orm@0.42.0(@electric-sql/pglite@0.3.7)(@neondatabase/serverless@0.10.4)(@types/pg@8.11.6)(@vercel/postgres@0.10.0(utf-8-validate@6.0.3))(kysely@0.28.2)(pg@8.13.1)(postgres@3.4.5))(zod@3.24.0):
|
drizzle-zod@0.5.1(drizzle-orm@0.42.0(@neondatabase/serverless@0.10.4)(@types/pg@8.11.6)(@vercel/postgres@0.10.0(utf-8-validate@6.0.3))(kysely@0.28.2)(pg@8.13.1)(postgres@3.4.5))(zod@3.24.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
drizzle-orm: 0.42.0(@electric-sql/pglite@0.3.7)(@neondatabase/serverless@0.10.4)(@types/pg@8.11.6)(@vercel/postgres@0.10.0(utf-8-validate@6.0.3))(kysely@0.28.2)(pg@8.13.1)(postgres@3.4.5)
|
drizzle-orm: 0.42.0(@neondatabase/serverless@0.10.4)(@types/pg@8.11.6)(@vercel/postgres@0.10.0(utf-8-validate@6.0.3))(kysely@0.28.2)(pg@8.13.1)(postgres@3.4.5)
|
||||||
zod: 3.24.0
|
zod: 3.24.0
|
||||||
|
|
||||||
dunder-proto@1.0.0:
|
dunder-proto@1.0.0:
|
||||||
|
|||||||
@@ -93,7 +93,6 @@
|
|||||||
"SMTP_PASSWORD",
|
"SMTP_PASSWORD",
|
||||||
"SMTP_SECURE",
|
"SMTP_SECURE",
|
||||||
"NEXT_PUBLIC_KAN_ENV",
|
"NEXT_PUBLIC_KAN_ENV",
|
||||||
"NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY",
|
|
||||||
"STRIPE_SECRET_KEY",
|
"STRIPE_SECRET_KEY",
|
||||||
"STRIPE_WEBHOOK_SECRET",
|
"STRIPE_WEBHOOK_SECRET",
|
||||||
"STRIPE_PRO_PLAN_PRICE_ID",
|
"STRIPE_PRO_PLAN_PRICE_ID",
|
||||||
|
|||||||
Reference in New Issue
Block a user