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} étiquettes"
#. placeholder {0}: isTemplate ? "Template" : "Board"
#: src/views/board/index.tsx:387
#: src/views/board/index.tsx:389
msgid "{0} not found"
msgstr "{0} introuvable"
@@ -79,8 +79,8 @@ msgstr "Compte"
msgid "Account deleted"
msgstr "Compte supprimé"
#: 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 "Activité"
@@ -109,7 +109,7 @@ msgstr "Ajouter un élément..."
msgid "Add checklist"
msgstr "Ajouter une checklist"
#: src/components/Editor.tsx:442
#: src/components/Editor.tsx:451
msgid "Add description... (type '/' to open commands or '@' to mention)"
msgstr "Ajouter une description... (tapez '/' pour ouvrir les commandes ou '@' pour mentionner)"
@@ -270,6 +270,10 @@ msgstr "a assigné <0>{0}</0> à la carte"
msgid "Assignees"
msgstr "Assignés"
#: src/views/card/components/AttachmentUpload.tsx:25
msgid "Attachment uploaded"
msgstr "Pièce jointe téléversée"
#: src/views/boards/components/TemplateBoards.tsx:47
msgid "Awaiting Customer"
msgstr "En attente du client"
@@ -304,9 +308,9 @@ msgstr "Portail de facturation"
msgid "Blog Post"
msgstr "Article de blog"
#: 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 "Tableau"
@@ -323,7 +327,7 @@ msgstr "Le nom du tableau ne peut pas dépasser 100 caractères"
msgid "Board name is required"
msgstr "Le nom du tableau est requis"
#: src/views/public/board/index.tsx:151
#: src/views/public/board/index.tsx:153
msgid "Board not found"
msgstr "Tableau introuvable"
@@ -331,19 +335,19 @@ msgstr "Tableau introuvable"
msgid "Board sharing & invites"
msgstr "Partage de tableau & invitations"
#: 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 "L'URL du tableau ne peut contenir que des lettres, des chiffres et des traits d'union"
#: src/views/board/components/UpdateBoardSlugForm.tsx:43
#: src/views/board/components/UpdateBoardSlugForm.tsx:44
msgid "Board URL cannot exceed 60 characters"
msgstr "L'URL du tableau ne peut pas dépasser 60 caractères"
#: src/views/public/board/index.tsx:67
#: src/views/public/board/index.tsx:68
msgid "Board URL copied to clipboard"
msgstr "URL du tableau copiée dans le presse-papiers"
#: 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 "L'URL du tableau doit comporter au moins 3 caractères"
@@ -352,7 +356,7 @@ msgstr "L'URL du tableau doit comporter au moins 3 caractères"
msgid "Board visibility"
msgstr "Visibilité du tableau"
#: src/views/board/components/VisibilityButton.tsx:45
#: src/views/board/components/VisibilityButton.tsx:46
msgid "Board visibility updated"
msgstr "Visibilité du tableau mise à jour"
@@ -387,15 +391,15 @@ msgstr "Rapport de bug"
msgid "Cancel"
msgstr "Annuler"
#: src/views/card/index.tsx:216
#: src/views/card/index.tsx:218
msgid "Card"
msgstr "Carte"
#: src/views/card/index.tsx:262
#: src/views/card/index.tsx:264
msgid "Card not found"
msgstr "Carte introuvable"
#: src/views/board/components/NewCardForm.tsx:309
#: src/views/board/components/NewCardForm.tsx:310
msgid "Card title"
msgstr "Titre de la carte"
@@ -428,7 +432,7 @@ msgstr "Nom de la checklist"
msgid "Checklists"
msgstr "Listes de contrôle"
#: src/views/board/components/Filters.tsx:155
#: src/views/board/components/Filters.tsx:180
msgid "Clear filters"
msgstr "Effacer les filtres"
@@ -542,8 +546,8 @@ msgid "Create {0}"
msgstr "Créer {0}"
#: 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 "Créer un autre"
@@ -551,7 +555,7 @@ msgstr "Créer un autre"
msgid "Create API key"
msgstr "Créer une clé API"
#: src/views/board/components/NewCardForm.tsx:478
#: src/views/board/components/NewCardForm.tsx:479
msgid "Create card"
msgstr "Créer une carte"
@@ -567,7 +571,7 @@ msgstr "Créer un lien d'invitation"
msgid "Create label"
msgstr "Créer une étiquette"
#: src/views/board/components/NewListForm.tsx:152
#: src/views/board/components/NewListForm.tsx:153
msgid "Create list"
msgstr "Créer une liste"
@@ -580,12 +584,12 @@ msgstr "Créer un nouveau {0}"
msgid "Create new key"
msgstr "Créer une nouvelle clé"
#: 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 "Créer une nouvelle étiquette"
#: src/views/board/index.tsx:475
#: src/views/board/index.tsx:478
msgid "Create new list"
msgstr "Créer une nouvelle liste"
@@ -769,8 +773,12 @@ msgstr "Vous n'avez pas de compte ? <0><1>Inscrivez-vous</1></0>"
msgid "Done"
msgstr "Fait"
#: src/views/card/components/AttachmentThumbnails.tsx:141
msgid "Download failed"
msgstr "Échec du téléchargement"
#: 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 "Modifier l'URL du tableau"
@@ -782,7 +790,7 @@ msgstr "Modifier le commentaire"
msgid "Edit label"
msgstr "Modifier l'étiquette"
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
#: src/views/board/components/UpdateBoardSlugForm.tsx:162
msgid "Edit workspace URL"
msgstr "Modifier l'URL de l'espace de travail"
@@ -931,6 +939,11 @@ msgstr "Échec de la création du tableau"
msgid "Failed to login with {0}. Please try again."
msgstr "Échec de connexion avec {0}. Veuillez réessayer."
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
msgid "Failed to upload attachment. Please try again."
msgstr "Échec du téléversement de la pièce jointe. Veuillez réessayer."
#: src/views/home/components/Header.tsx:41
msgid "FAQ"
msgstr "FAQ"
@@ -974,7 +987,7 @@ msgstr "Commentaires"
msgid "Feedback sent"
msgstr "Commentaires envoyés"
#: src/views/board/components/Filters.tsx:149
#: src/views/board/components/Filters.tsx:174
msgid "Filter"
msgstr "Filtrer"
@@ -987,6 +1000,8 @@ msgid "For long-term sustainability, we recognise all good open source projects
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 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/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 "Gratuit"
@@ -1028,7 +1043,7 @@ msgstr "Commencer"
msgid "Get started by creating a new {0}"
msgstr "Commencez par créer un nouveau {0}"
#: src/views/board/index.tsx:467
#: src/views/board/index.tsx:470
msgid "Get started by creating a new list"
msgstr "Commencez par créer une nouvelle liste"
@@ -1242,9 +1257,9 @@ msgstr "Kanban réinventé"
msgid "Keep in mind that this action is irreversible."
msgstr "Gardez à l'esprit que cette action est irréversible."
#: 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 "Étiquettes"
@@ -1294,18 +1309,22 @@ msgstr "Licence"
msgid "Light"
msgstr "Clair"
#: src/views/public/board/index.tsx:65
#: src/views/public/board/index.tsx:66
msgid "Link copied"
msgstr "Lien copié"
#: src/views/card/index.tsx:109
#: src/views/card/index.tsx:111
msgid "List"
msgstr "Liste"
#: src/views/board/components/NewListForm.tsx:128
#: src/views/board/components/NewListForm.tsx:129
msgid "List name"
msgstr "Nom de la liste"
#: src/views/board/components/Filters.tsx:123
msgid "Lists"
msgstr "Listes"
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Connexion | kan.bn"
@@ -1348,9 +1367,9 @@ msgid "Medium Priority"
msgstr "Priorité moyenne"
#: 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 "Membres"
@@ -1403,7 +1422,7 @@ msgstr "Nouveau {0}"
msgid "New API key"
msgstr "Nouvelle clé API"
#: src/views/board/components/NewCardForm.tsx:292
#: src/views/board/components/NewCardForm.tsx:293
msgid "New card"
msgstr "Nouvelle carte"
@@ -1419,8 +1438,8 @@ msgstr "Nouvel import"
msgid "New label"
msgstr "Nouvelle étiquette"
#: 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 "Nouvelle liste"
@@ -1469,7 +1488,11 @@ msgstr "Aucun tableau trouvé"
msgid "No credit card required"
msgstr "Aucune carte de crédit requise"
#: src/views/board/index.tsx:464
#: src/views/card/components/AttachmentThumbnails.tsx:142
msgid "No download URL available for this attachment."
msgstr "Aucune URL de téléchargement disponible pour cette pièce jointe."
#: src/views/board/index.tsx:467
msgid "No lists"
msgstr "Aucune liste"
@@ -1602,15 +1625,16 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
#: 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 "Veuillez sélectionner un fichier à télécharger."
#: 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 "Support par e-mail prioritaire"
msgid "Privacy policy"
msgstr "Politique de confidentialité"
#: src/views/board/components/VisibilityButton.tsx:73
#: src/views/board/components/VisibilityButton.tsx:74
msgid "Private"
msgstr "Privé"
@@ -1688,7 +1712,7 @@ msgstr "Image de profil mise à jour"
msgid "Profile picture"
msgstr "Photo de profil"
#: src/views/board/components/VisibilityButton.tsx:68
#: src/views/board/components/VisibilityButton.tsx:69
msgid "Public"
msgstr "Public"
@@ -1957,8 +1981,8 @@ msgstr "Forfait d'équipe"
msgid "Teams"
msgstr "Équipes"
#: 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 "Modèle"
@@ -2008,7 +2032,7 @@ msgid "The open source <0/> alternative to Trello"
msgstr "L'alternative open source <0/> à 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 "La visibilité de votre tableau a été définie sur {0}."
@@ -2032,11 +2056,11 @@ msgstr "Cette action ne peut pas être annulée."
msgid "This API key will only be shown once. Please save it in a secure location."
msgstr "Cette clé API ne sera affichée qu'une seule fois. Veuillez la sauvegarder dans un emplacement sécurisé."
#: src/views/public/board/index.tsx:154
#: src/views/public/board/index.tsx:156
msgid "This board is private or does not exist"
msgstr "Ce tableau est privé ou n'existe pas"
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
#: src/views/board/components/UpdateBoardSlugForm.tsx:136
msgid "This board URL has already been taken"
msgstr "Cette URL de tableau est déjà utilisée"
@@ -2106,7 +2130,7 @@ msgstr "Impossible d'ajouter l'élément à la liste de contrôle"
msgid "Unable to add comment"
msgstr "Impossible d'ajouter un commentaire"
#: src/views/board/components/NewCardForm.tsx:173
#: src/views/board/components/NewCardForm.tsx:174
msgid "Unable to create card"
msgstr "Impossible de créer la carte"
@@ -2114,7 +2138,7 @@ msgstr "Impossible de créer la carte"
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:78
msgid "Unable to create list"
msgstr "Impossible de créer une liste"
@@ -2127,6 +2151,10 @@ msgstr "Impossible de créer le modèle"
msgid "Unable to create workspace"
msgstr "Impossible de créer l'espace de travail"
#: src/views/card/components/AttachmentThumbnails.tsx:72
msgid "Unable to delete attachment"
msgstr "Impossible de supprimer la pièce jointe"
#: src/views/card/components/DeleteCardConfirmation.tsx:51
msgid "Unable to delete card"
msgstr "Impossible de supprimer la carte"
@@ -2151,16 +2179,16 @@ msgstr "Impossible de supprimer le membre"
msgid "Unable to send feedback"
msgstr "Impossible d'envoyer les commentaires"
#: src/views/board/components/UpdateBoardSlugForm.tsx:71
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
msgid "Unable to update board URL"
msgstr "Impossible de mettre à jour l'URL du tableau"
#: src/views/board/components/VisibilityButton.tsx:52
#: src/views/board/components/VisibilityButton.tsx:53
msgid "Unable to update board visibility"
msgstr "Impossible de mettre à jour la visibilité du tableau"
#: 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 "Impossible de mettre à jour la carte"
@@ -2180,7 +2208,7 @@ msgstr "Impossible de mettre à jour le commentaire"
msgid "Unable to update labels"
msgstr "Impossible de mettre à jour les étiquettes"
#: 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 "Impossible de mettre à jour la liste"
@@ -2236,7 +2264,7 @@ msgstr "Membres illimités"
msgid "Unlimited workspaces"
msgstr "Espaces de travail illimités"
#: 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 "Passer à Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Passer à Pro (29 $/mois)"
#: src/views/card/components/AttachmentUpload.tsx:32
#: src/views/card/components/AttachmentUpload.tsx:78
msgid "Upload failed"
msgstr "Échec du téléversement"
#: src/views/boards/components/TemplateBoards.tsx:38
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Urgent"
@@ -2324,7 +2357,7 @@ msgstr "Consultez et gérez votre facturation et votre abonnement."
msgid "View docs"
msgstr "Voir la documentation"
#: src/views/public/board/index.tsx:128
#: src/views/public/board/index.tsx:129
msgid "View only"
msgstr "Affichage uniquement"
@@ -2332,11 +2365,11 @@ msgstr "Affichage uniquement"
msgid "View our roadmap."
msgstr "Consultez notre feuille de route."
#: src/views/public/board/index.tsx:157
#: src/views/public/board/index.tsx:159
msgid "View workspace"
msgstr "Voir l'espace de travail"
#: src/views/board/components/VisibilityButton.tsx:91
#: src/views/board/components/VisibilityButton.tsx:92
msgid "Visibility"
msgstr "Visibilité"
@@ -2373,10 +2406,10 @@ msgid "Why make an open source Trello?"
msgstr "Pourquoi créer un Trello open source ?"
#: 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 "Espace de travail"
@@ -2506,6 +2539,10 @@ msgstr "Vos tableaux ont été importés."
msgid "Your display name has been updated."
msgstr "Votre nom d'affichage a été mis à jour."
#: src/views/card/components/AttachmentUpload.tsx:26
msgid "Your file has been uploaded successfully."
msgstr "Votre fichier a été téléversé avec succès."
#: src/views/settings/components/ChangePasswordConfirmation.tsx:70
msgid "Your password has been changed."
msgstr "Votre mot de passe a été modifié."

File diff suppressed because one or more lines are too long