feat: card attachments (#247)

* feat: add card attachment schema

* feat: setup s3 util funcs

* feat: add attachments router and repo funcs

* feat: add upload button

* feat: add thumbnails and attachment viewer

* feat: add download and delete button

* feat: add file viewer and downloads

* feat: update compose and readme

* chore: build lang

* feat: display attachments on public boards

* chore: update compiled translations
This commit is contained in:
Henry
2025-11-19 21:34:43 +00:00
committed by GitHub
parent af6490896a
commit b472c5ce93
45 changed files with 5120 additions and 581 deletions

View File

@@ -31,17 +31,17 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:22
#: src/views/card/index.tsx:216
#: src/views/card/index.tsx:218
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:442
#: src/views/board/components/NewCardForm.tsx:443
msgid "{0} labels"
msgstr "{0} labels"
#. placeholder {0}: isTemplate ? "Template" : "Board"
#: src/views/board/index.tsx:387
#: src/views/board/index.tsx:389
msgid "{0} not found"
msgstr "{0} niet gevonden"
@@ -79,8 +79,8 @@ msgstr "Account"
msgid "Account deleted"
msgstr "Account verwijderd"
#: src/views/card/index.tsx:291
#: src/views/public/board/CardModal.tsx:143
#: src/views/card/index.tsx:308
#: src/views/public/board/CardModal.tsx:157
msgid "Activity"
msgstr "Activiteit"
@@ -109,7 +109,7 @@ msgstr "Voeg een item toe..."
msgid "Add checklist"
msgstr "Checklist toevoegen"
#: src/components/Editor.tsx:442
#: src/components/Editor.tsx:451
msgid "Add description... (type '/' to open commands or '@' to mention)"
msgstr "Beschrijving toevoegen... (typ '/' om commando's te openen of '@' om te vermelden)"
@@ -270,6 +270,10 @@ msgstr "heeft <0>{0}</0> aan de kaart toegewezen"
msgid "Assignees"
msgstr "Toegewezen personen"
#: src/views/card/components/AttachmentUpload.tsx:25
msgid "Attachment uploaded"
msgstr "Bijlage geüpload"
#: src/views/boards/components/TemplateBoards.tsx:47
msgid "Awaiting Customer"
msgstr "Wachten op klant"
@@ -304,9 +308,9 @@ msgstr "Factureringsportaal"
msgid "Blog Post"
msgstr "Blogbericht"
#: src/views/board/index.tsx:361
#: src/views/card/index.tsx:216
#: src/views/public/board/index.tsx:100
#: src/views/board/index.tsx:363
#: src/views/card/index.tsx:218
#: src/views/public/board/index.tsx:101
msgid "Board"
msgstr "Bord"
@@ -323,7 +327,7 @@ msgstr "Bordnaam mag niet langer zijn dan 100 tekens"
msgid "Board name is required"
msgstr "Bordnaam is verplicht"
#: src/views/public/board/index.tsx:151
#: src/views/public/board/index.tsx:153
msgid "Board not found"
msgstr "Bord niet gevonden"
@@ -331,19 +335,19 @@ msgstr "Bord niet gevonden"
msgid "Board sharing & invites"
msgstr "Bord delen & uitnodigingen"
#: src/views/board/components/UpdateBoardSlugForm.tsx:45
#: src/views/board/components/UpdateBoardSlugForm.tsx:46
msgid "Board URL can only contain letters, numbers, and hyphens"
msgstr "Board URL kan alleen letters, cijfers en koppeltekens bevatten"
#: src/views/board/components/UpdateBoardSlugForm.tsx:43
#: src/views/board/components/UpdateBoardSlugForm.tsx:44
msgid "Board URL cannot exceed 60 characters"
msgstr "Board URL mag niet langer zijn dan 60 tekens"
#: src/views/public/board/index.tsx:67
#: src/views/public/board/index.tsx:68
msgid "Board URL copied to clipboard"
msgstr "Board URL gekopieerd naar klembord"
#: src/views/board/components/UpdateBoardSlugForm.tsx:41
#: src/views/board/components/UpdateBoardSlugForm.tsx:42
msgid "Board URL must be at least 3 characters long"
msgstr "Board URL moet minimaal 3 tekens lang zijn"
@@ -352,7 +356,7 @@ msgstr "Board URL moet minimaal 3 tekens lang zijn"
msgid "Board visibility"
msgstr "Bordzichtbaarheid"
#: src/views/board/components/VisibilityButton.tsx:45
#: src/views/board/components/VisibilityButton.tsx:46
msgid "Board visibility updated"
msgstr "Zichtbaarheid van bord bijgewerkt"
@@ -387,15 +391,15 @@ msgstr "Bugrapport"
msgid "Cancel"
msgstr "Annuleren"
#: src/views/card/index.tsx:216
#: src/views/card/index.tsx:218
msgid "Card"
msgstr "Kaart"
#: src/views/card/index.tsx:262
#: src/views/card/index.tsx:264
msgid "Card not found"
msgstr "Kaart niet gevonden"
#: src/views/board/components/NewCardForm.tsx:309
#: src/views/board/components/NewCardForm.tsx:310
msgid "Card title"
msgstr "Kaarttitel"
@@ -428,7 +432,7 @@ msgstr "Naam checklist"
msgid "Checklists"
msgstr "Checklists"
#: src/views/board/components/Filters.tsx:155
#: src/views/board/components/Filters.tsx:180
msgid "Clear filters"
msgstr "Filters wissen"
@@ -542,8 +546,8 @@ msgid "Create {0}"
msgstr "{0} maken"
#: src/components/LabelForm.tsx:213
#: src/views/board/components/NewCardForm.tsx:468
#: src/views/board/components/NewListForm.tsx:140
#: src/views/board/components/NewCardForm.tsx:469
#: src/views/board/components/NewListForm.tsx:141
msgid "Create another"
msgstr "Maak nog een"
@@ -551,7 +555,7 @@ msgstr "Maak nog een"
msgid "Create API key"
msgstr "API-sleutel aanmaken"
#: src/views/board/components/NewCardForm.tsx:478
#: src/views/board/components/NewCardForm.tsx:479
msgid "Create card"
msgstr "Maak kaart"
@@ -567,7 +571,7 @@ msgstr "Uitnodigingslink maken"
msgid "Create label"
msgstr "Maak label"
#: src/views/board/components/NewListForm.tsx:152
#: src/views/board/components/NewListForm.tsx:153
msgid "Create list"
msgstr "Lijst maken"
@@ -580,12 +584,12 @@ msgstr "Nieuwe {0} maken"
msgid "Create new key"
msgstr "Nieuwe sleutel aanmaken"
#: src/views/board/components/NewCardForm.tsx:404
#: src/views/board/components/NewCardForm.tsx:405
#: src/views/card/components/LabelSelector.tsx:97
msgid "Create new label"
msgstr "Maak nieuw label"
#: src/views/board/index.tsx:475
#: src/views/board/index.tsx:478
msgid "Create new list"
msgstr "Maak nieuwe lijst"
@@ -769,8 +773,12 @@ msgstr "Heb je geen account? <0><1>Registreer je</1></0>"
msgid "Done"
msgstr "Klaar"
#: src/views/card/components/AttachmentThumbnails.tsx:141
msgid "Download failed"
msgstr "Download mislukt"
#: src/views/board/components/BoardDropdown.tsx:41
#: src/views/board/components/UpdateBoardSlugForm.tsx:115
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
msgid "Edit board URL"
msgstr "Board URL bewerken"
@@ -782,7 +790,7 @@ msgstr "Reactie bewerken"
msgid "Edit label"
msgstr "Label bewerken"
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
#: src/views/board/components/UpdateBoardSlugForm.tsx:162
msgid "Edit workspace URL"
msgstr "Werkruimte-URL bewerken"
@@ -931,6 +939,11 @@ msgstr "Bord maken mislukt"
msgid "Failed to login with {0}. Please try again."
msgstr "Inloggen met {0} is mislukt. Probeer het opnieuw."
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
msgid "Failed to upload attachment. Please try again."
msgstr "Bijlage uploaden mislukt. Probeer het opnieuw."
#: src/views/home/components/Header.tsx:41
msgid "FAQ"
msgstr "FAQ"
@@ -974,7 +987,7 @@ msgstr "Feedback"
msgid "Feedback sent"
msgstr "Feedback verzonden"
#: src/views/board/components/Filters.tsx:149
#: src/views/board/components/Filters.tsx:174
msgid "Filter"
msgstr "Filter"
@@ -987,6 +1000,8 @@ msgid "For long-term sustainability, we recognise all good open source projects
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 en voor aangepaste werkruimte-slugs. Er is geen verplichting om het te gebruiken, en je kunt de software gratis op je eigen infrastructuur hosten."
#: src/views/pricing/components/Pricing.tsx:32
#: src/views/pricing/components/Pricing.tsx:32
#: src/views/pricing/components/PricingTiers.tsx:30
#: src/views/pricing/components/PricingTiers.tsx:30
msgid "Free"
msgstr "Gratis"
@@ -1028,7 +1043,7 @@ msgstr "Aan de slag"
msgid "Get started by creating a new {0}"
msgstr "Begin door een nieuwe {0} te maken"
#: src/views/board/index.tsx:467
#: src/views/board/index.tsx:470
msgid "Get started by creating a new list"
msgstr "Begin door een nieuwe lijst te maken"
@@ -1242,9 +1257,9 @@ msgstr "Kanban opnieuw uitgevonden"
msgid "Keep in mind that this action is irreversible."
msgstr "Houd er rekening mee dat deze actie onomkeerbaar is."
#: src/views/board/components/Filters.tsx:101
#: src/views/board/components/NewCardForm.tsx:408
#: src/views/card/index.tsx:117
#: src/views/board/components/Filters.tsx:115
#: src/views/board/components/NewCardForm.tsx:409
#: src/views/card/index.tsx:119
msgid "Labels"
msgstr "Labels"
@@ -1294,18 +1309,22 @@ msgstr "Licentie"
msgid "Light"
msgstr "Licht"
#: src/views/public/board/index.tsx:65
#: src/views/public/board/index.tsx:66
msgid "Link copied"
msgstr "Link gekopieerd"
#: src/views/card/index.tsx:109
#: src/views/card/index.tsx:111
msgid "List"
msgstr "Lijst"
#: src/views/board/components/NewListForm.tsx:128
#: src/views/board/components/NewListForm.tsx:129
msgid "List name"
msgstr "Lijstnaam"
#: src/views/board/components/Filters.tsx:123
msgid "Lists"
msgstr "Lijsten"
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
@@ -1348,9 +1367,9 @@ msgid "Medium Priority"
msgstr "Gemiddelde prioriteit"
#: src/components/SideNavigation.tsx:101
#: src/views/board/components/Filters.tsx:93
#: src/views/board/components/NewCardForm.tsx:366
#: src/views/card/index.tsx:126
#: src/views/board/components/Filters.tsx:107
#: src/views/board/components/NewCardForm.tsx:367
#: src/views/card/index.tsx:128
#: src/views/members/index.tsx:178
msgid "Members"
msgstr "Leden"
@@ -1403,7 +1422,7 @@ msgstr "Nieuwe {0}"
msgid "New API key"
msgstr "Nieuwe API-sleutel"
#: src/views/board/components/NewCardForm.tsx:292
#: src/views/board/components/NewCardForm.tsx:293
msgid "New card"
msgstr "Nieuwe kaart"
@@ -1419,8 +1438,8 @@ msgstr "Nieuwe import"
msgid "New label"
msgstr "Nieuw label"
#: src/views/board/components/NewListForm.tsx:112
#: src/views/board/index.tsx:439
#: src/views/board/components/NewListForm.tsx:113
#: src/views/board/index.tsx:442
msgid "New list"
msgstr "Nieuwe lijst"
@@ -1469,7 +1488,11 @@ msgstr "Geen borden gevonden"
msgid "No credit card required"
msgstr "Geen creditcard vereist"
#: src/views/board/index.tsx:464
#: src/views/card/components/AttachmentThumbnails.tsx:142
msgid "No download URL available for this attachment."
msgstr "Geen download-URL beschikbaar voor deze bijlage."
#: src/views/board/index.tsx:467
msgid "No lists"
msgstr "Geen lijsten"
@@ -1602,15 +1625,16 @@ msgstr "Selecteer een bestand om te uploaden."
#: src/components/DeleteLabelConfirmation.tsx:26
#: src/components/FeedbackModal.tsx:41
#: src/components/NewWorkspaceForm.tsx:158
#: src/views/board/components/NewCardForm.tsx:176
#: src/views/board/components/NewListForm.tsx:78
#: src/views/board/components/NewCardForm.tsx:177
#: src/views/board/components/NewListForm.tsx:79
#: src/views/board/components/NewTemplateForm.tsx:61
#: src/views/board/components/NewTemplateForm.tsx:77
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
#: src/views/board/components/VisibilityButton.tsx:53
#: src/views/board/index.tsx:149
#: src/views/board/index.tsx:205
#: src/views/board/components/UpdateBoardSlugForm.tsx:73
#: src/views/board/components/VisibilityButton.tsx:54
#: src/views/board/index.tsx:151
#: src/views/board/index.tsx:207
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/ChecklistItemRow.tsx:60
#: src/views/card/components/ChecklistItemRow.tsx:88
#: src/views/card/components/ChecklistNameInput.tsx:46
@@ -1624,7 +1648,7 @@ msgstr "Selecteer een bestand om te uploaden."
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:175
#: src/views/card/index.tsx:177
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -1668,7 +1692,7 @@ msgstr "Prioriteit e-mailondersteuning"
msgid "Privacy policy"
msgstr "Privacybeleid"
#: src/views/board/components/VisibilityButton.tsx:73
#: src/views/board/components/VisibilityButton.tsx:74
msgid "Private"
msgstr "Privé"
@@ -1688,7 +1712,7 @@ msgstr "Profielafbeelding bijgewerkt"
msgid "Profile picture"
msgstr "Profielfoto"
#: src/views/board/components/VisibilityButton.tsx:68
#: src/views/board/components/VisibilityButton.tsx:69
msgid "Public"
msgstr "Openbaar"
@@ -1957,8 +1981,8 @@ msgstr "Teamplan"
msgid "Teams"
msgstr "Teams"
#: src/views/board/index.tsx:361
#: src/views/board/index.tsx:396
#: src/views/board/index.tsx:363
#: src/views/board/index.tsx:398
msgid "Template"
msgstr "Sjabloon"
@@ -2008,7 +2032,7 @@ msgid "The open source <0/> alternative to Trello"
msgstr "Het open source <0/> alternatief voor Trello"
#. placeholder {0}: isPublic ? "public" : "private"
#: src/views/board/components/VisibilityButton.tsx:46
#: src/views/board/components/VisibilityButton.tsx:47
msgid "The visibility of your board has been set to {0}."
msgstr "De zichtbaarheid van je bord is ingesteld op {0}."
@@ -2032,11 +2056,11 @@ msgstr "Deze actie kan niet ongedaan worden gemaakt."
msgid "This API key will only be shown once. Please save it in a secure location."
msgstr "Deze API-sleutel wordt slechts één keer getoond. Bewaar deze op een veilige plaats."
#: src/views/public/board/index.tsx:154
#: src/views/public/board/index.tsx:156
msgid "This board is private or does not exist"
msgstr "Dit bord is privé of bestaat niet"
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
#: src/views/board/components/UpdateBoardSlugForm.tsx:136
msgid "This board URL has already been taken"
msgstr "Deze board URL is al in gebruik"
@@ -2106,7 +2130,7 @@ msgstr "Kan checklistitem niet toevoegen"
msgid "Unable to add comment"
msgstr "Kan geen reactie toevoegen"
#: src/views/board/components/NewCardForm.tsx:173
#: src/views/board/components/NewCardForm.tsx:174
msgid "Unable to create card"
msgstr "Kan kaart niet aanmaken"
@@ -2114,7 +2138,7 @@ msgstr "Kan kaart niet aanmaken"
msgid "Unable to create checklist"
msgstr "Kan checklist niet maken"
#: src/views/board/components/NewListForm.tsx:77
#: src/views/board/components/NewListForm.tsx:78
msgid "Unable to create list"
msgstr "Kan geen lijst maken"
@@ -2127,6 +2151,10 @@ msgstr "Kan sjabloon niet maken"
msgid "Unable to create workspace"
msgstr "Kan werkruimte niet aanmaken"
#: src/views/card/components/AttachmentThumbnails.tsx:72
msgid "Unable to delete attachment"
msgstr "Kan bijlage niet verwijderen"
#: src/views/card/components/DeleteCardConfirmation.tsx:51
msgid "Unable to delete card"
msgstr "Kan kaart niet verwijderen"
@@ -2151,16 +2179,16 @@ msgstr "Kan lid niet verwijderen"
msgid "Unable to send feedback"
msgstr "Feedback kon niet worden verzonden"
#: src/views/board/components/UpdateBoardSlugForm.tsx:71
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
msgid "Unable to update board URL"
msgstr "Kan board URL niet bijwerken"
#: src/views/board/components/VisibilityButton.tsx:52
#: src/views/board/components/VisibilityButton.tsx:53
msgid "Unable to update board visibility"
msgstr "Kan bordzichtbaarheid niet bijwerken"
#: src/views/board/index.tsx:204
#: src/views/card/index.tsx:174
#: src/views/board/index.tsx:206
#: src/views/card/index.tsx:176
msgid "Unable to update card"
msgstr "Kan kaart niet bijwerken"
@@ -2180,7 +2208,7 @@ msgstr "Kan reactie niet bijwerken"
msgid "Unable to update labels"
msgstr "Kan labels niet bijwerken"
#: src/views/board/index.tsx:148
#: src/views/board/index.tsx:150
#: src/views/card/components/ListSelector.tsx:51
msgid "Unable to update list"
msgstr "Kan lijst niet bijwerken"
@@ -2236,7 +2264,7 @@ msgstr "Onbeperkt aantal leden"
msgid "Unlimited workspaces"
msgstr "Onbeperkte werkruimtes"
#: src/views/board/components/UpdateBoardSlugForm.tsx:174
#: src/views/board/components/UpdateBoardSlugForm.tsx:175
#: src/views/settings/components/UpdateDisplayNameForm.tsx:80
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:91
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:83
@@ -2275,6 +2303,11 @@ msgstr "Upgraden naar Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Upgrade naar Pro ($29/maand)"
#: src/views/card/components/AttachmentUpload.tsx:32
#: src/views/card/components/AttachmentUpload.tsx:78
msgid "Upload failed"
msgstr "Uploaden mislukt"
#: src/views/boards/components/TemplateBoards.tsx:38
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Urgent"
@@ -2324,7 +2357,7 @@ msgstr "Bekijk en beheer je facturering en abonnement."
msgid "View docs"
msgstr "Bekijk documentatie"
#: src/views/public/board/index.tsx:128
#: src/views/public/board/index.tsx:129
msgid "View only"
msgstr "Alleen bekijken"
@@ -2332,11 +2365,11 @@ msgstr "Alleen bekijken"
msgid "View our roadmap."
msgstr "Bekijk onze roadmap."
#: src/views/public/board/index.tsx:157
#: src/views/public/board/index.tsx:159
msgid "View workspace"
msgstr "Werkruimte bekijken"
#: src/views/board/components/VisibilityButton.tsx:91
#: src/views/board/components/VisibilityButton.tsx:92
msgid "Visibility"
msgstr "Zichtbaarheid"
@@ -2373,10 +2406,10 @@ msgid "Why make an open source Trello?"
msgstr "Waarom een open source Trello maken?"
#: src/components/SettingsLayout.tsx:39
#: src/views/board/index.tsx:361
#: src/views/board/index.tsx:363
#: src/views/boards/index.tsx:22
#: src/views/members/index.tsx:173
#: src/views/public/board/index.tsx:100
#: src/views/public/board/index.tsx:101
#: src/views/public/boards/index.tsx:66
msgid "Workspace"
msgstr "Werkruimte"
@@ -2506,6 +2539,10 @@ msgstr "Je borden zijn geïmporteerd."
msgid "Your display name has been updated."
msgstr "Je weergavenaam is bijgewerkt."
#: src/views/card/components/AttachmentUpload.tsx:26
msgid "Your file has been uploaded successfully."
msgstr "Je bestand is succesvol geüpload."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:70
msgid "Your password has been changed."
msgstr "Je wachtwoord is gewijzigd."

File diff suppressed because one or more lines are too long