feat: card checklists (#141)
* feat: setup checklist schema * feat: scaffold checklist router * feat: add create new checklist modal * feat: create new checklist item * feat: toggle checklist item completed state * feat: update checklist name * feat: delete checklist * feat: show checklists progress on cards * feat: tweak light mode styling * feat: focus item form on creation of new checklist * feat: tweak new checklist item form styling * feat: add checklist activity * feat: show checklist progress on public board page * feat: display checklist items on public card modal * chore: add translations
This commit is contained in:
@@ -5,7 +5,7 @@ import LoadingSpinner from "./LoadingSpinner";
|
||||
|
||||
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
||||
variant?: "primary" | "secondary" | "danger" | "ghost";
|
||||
size?: "sm" | "md" | "lg";
|
||||
size?: "xs" | "sm" | "md" | "lg";
|
||||
isLoading?: boolean;
|
||||
iconLeft?: React.ReactNode;
|
||||
iconRight?: React.ReactNode;
|
||||
@@ -28,6 +28,7 @@ const Button = ({
|
||||
}: ButtonProps) => {
|
||||
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",
|
||||
size === "xs" && "text-xs px-2 py-1",
|
||||
size === "sm" && "text-xs",
|
||||
size === "lg" && "py-[0.65rem]",
|
||||
fullWidth && "w-full",
|
||||
|
||||
58
apps/web/src/components/CircularProgress.tsx
Normal file
58
apps/web/src/components/CircularProgress.tsx
Normal file
@@ -0,0 +1,58 @@
|
||||
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;
|
||||
@@ -15,10 +15,15 @@ import {
|
||||
ReactRenderer,
|
||||
useEditor,
|
||||
} from "@tiptap/react";
|
||||
import { useEffect } from "react";
|
||||
import StarterKit from "@tiptap/starter-kit";
|
||||
import Suggestion from "@tiptap/suggestion";
|
||||
import { forwardRef, useImperativeHandle, useRef, useState } from "react";
|
||||
import {
|
||||
forwardRef,
|
||||
useEffect,
|
||||
useImperativeHandle,
|
||||
useRef,
|
||||
useState,
|
||||
} from "react";
|
||||
import {
|
||||
HiH1,
|
||||
HiH2,
|
||||
@@ -547,7 +552,7 @@ export default function Editor({
|
||||
{!readOnly && editor && <EditorBubbleMenu editor={editor} />}
|
||||
<EditorContent
|
||||
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-black [&_p]:dark:text-white [&_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-light-950 [&_p]:dark:text-dark-950 [&_ul]:!text-xs"
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -23,7 +23,7 @@ msgstr ", oder besuche unsere"
|
||||
|
||||
#. placeholder {0}: card?.title ?? "Card"
|
||||
#. placeholder {1}: board?.name ?? "Board"
|
||||
#: src/views/card/index.tsx:189
|
||||
#: src/views/card/index.tsx:214
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
@@ -48,8 +48,8 @@ msgstr "Eine leistungsstarke, flexible Kanban-App, die dir hilft, Arbeit zu orga
|
||||
msgid "Account deleted"
|
||||
msgstr "Konto gelöscht"
|
||||
|
||||
#: src/views/public/board/CardModal.tsx:128
|
||||
#: src/views/card/index.tsx:256
|
||||
#: src/views/public/board/CardModal.tsx:136
|
||||
#: src/views/card/index.tsx:287
|
||||
msgid "Activity"
|
||||
msgstr "Aktivität"
|
||||
|
||||
@@ -66,10 +66,22 @@ msgstr "Karte hinzufügen"
|
||||
msgid "Add a comment..."
|
||||
msgstr "Kommentar hinzufügen..."
|
||||
|
||||
#: src/components/Editor.tsx:303
|
||||
#: src/views/card/components/NewChecklistItemForm.tsx:140
|
||||
msgid "Add an item..."
|
||||
msgstr "Element hinzufügen..."
|
||||
|
||||
#: src/views/card/components/Dropdown.tsx:18
|
||||
msgid "Add checklist"
|
||||
msgstr "Checkliste hinzufügen"
|
||||
|
||||
#: src/components/Editor.tsx:308
|
||||
msgid "Add description... (type '/' to open commands)"
|
||||
msgstr "Beschreibung hinzufügen... (tippe '/' um Befehle zu öffnen)"
|
||||
|
||||
#: 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:118
|
||||
msgid "Add label"
|
||||
@@ -80,17 +92,36 @@ msgstr "Label hinzufügen"
|
||||
msgid "Add member"
|
||||
msgstr "Mitglied hinzufügen"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:56
|
||||
#: src/views/card/components/ActivityList.tsx:69
|
||||
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"
|
||||
msgstr "hat ein Label zur Karte hinzugefügt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:58
|
||||
#: src/views/card/components/ActivityList.tsx:67
|
||||
msgid "added a member to the card"
|
||||
msgstr "hat ein Mitglied zur Karte hinzugefügt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
msgid "added label <0>{label}</0>"
|
||||
msgstr "hat Label <0>{label}</0> hinzugefügt"
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
msgid "added checklist <0>{0}</0>"
|
||||
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
|
||||
msgid "Admin roles"
|
||||
@@ -141,6 +172,10 @@ msgstr "Bist du sicher, dass du den Workspace {0} löschen möchtest?"
|
||||
msgid "Are you sure you want to delete this card?"
|
||||
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
|
||||
msgid "Are you sure you want to delete this comment?"
|
||||
msgstr "Bist du sicher, dass du diesen Kommentar löschen möchtest?"
|
||||
@@ -153,9 +188,10 @@ msgstr "Sind Sie sicher, dass Sie dieses Label löschen möchten?"
|
||||
msgid "Are you sure you want to delete your account?"
|
||||
msgstr "Bist du sicher, dass du dein Konto löschen möchtest?"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
msgid "assigned <0>{memberName}</0> to the card"
|
||||
msgstr "hat <0>{memberName}</0> der Karte zugewiesen"
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "hat <0>{0}</0> der Karte zugewiesen"
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:46
|
||||
msgid "Awaiting Customer"
|
||||
@@ -182,7 +218,7 @@ msgstr "Abrechnungsportal"
|
||||
msgid "Blog Post"
|
||||
msgstr "Blogbeitrag"
|
||||
|
||||
#: src/views/board/index.tsx:332
|
||||
#: src/views/board/index.tsx:331
|
||||
msgid "Board"
|
||||
msgstr "Board"
|
||||
|
||||
@@ -195,7 +231,7 @@ msgid "Board name is required"
|
||||
msgstr "Boardname ist erforderlich"
|
||||
|
||||
#: src/views/public/board/index.tsx:143
|
||||
#: src/views/board/index.tsx:358
|
||||
#: src/views/board/index.tsx:357
|
||||
msgid "Board not found"
|
||||
msgstr "Board nicht gefunden"
|
||||
|
||||
@@ -250,13 +286,14 @@ msgstr "Fehlerbericht"
|
||||
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
||||
#: 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/Comment.tsx:158
|
||||
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||
msgid "Cancel"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
#: src/views/card/index.tsx:234
|
||||
#: src/views/card/index.tsx:259
|
||||
msgid "Card not found"
|
||||
msgstr "Karte nicht gefunden"
|
||||
|
||||
@@ -273,6 +310,10 @@ msgstr "Ändere die Sprache der App."
|
||||
msgid "Check your inbox"
|
||||
msgstr "Überprüfe deinen Posteingang"
|
||||
|
||||
#: src/views/card/components/NewChecklistForm.tsx:118
|
||||
msgid "Checklist name"
|
||||
msgstr "Checklistenname"
|
||||
|
||||
#: src/views/board/components/Filters.tsx:155
|
||||
msgid "Clear filters"
|
||||
msgstr "Filter löschen"
|
||||
@@ -310,6 +351,15 @@ msgstr "Abgeschlossen"
|
||||
msgid "Complete control and ownership:"
|
||||
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
|
||||
msgid "Confirm URL change"
|
||||
msgstr "URL-Änderung bestätigen"
|
||||
@@ -366,6 +416,10 @@ msgstr "Board erstellen"
|
||||
msgid "Create card"
|
||||
msgstr "Karte erstellen"
|
||||
|
||||
#: src/views/card/components/NewChecklistForm.tsx:134
|
||||
msgid "Create checklist"
|
||||
msgstr "Checkliste erstellen"
|
||||
|
||||
#: src/components/LabelForm.tsx:236
|
||||
msgid "Create label"
|
||||
msgstr "Label erstellen"
|
||||
@@ -387,7 +441,7 @@ msgstr "Neuen Schlüssel erstellen"
|
||||
msgid "Create new label"
|
||||
msgstr "Neues Label erstellen"
|
||||
|
||||
#: src/views/board/index.tsx:426
|
||||
#: src/views/board/index.tsx:425
|
||||
msgid "Create new list"
|
||||
msgstr "Neue Liste erstellen"
|
||||
|
||||
@@ -396,7 +450,7 @@ msgstr "Neue Liste erstellen"
|
||||
msgid "Create workspace"
|
||||
msgstr "Arbeitsbereich erstellen"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:52
|
||||
#: src/views/card/components/ActivityList.tsx:61
|
||||
msgid "created the card"
|
||||
msgstr "hat die Karte erstellt"
|
||||
|
||||
@@ -421,6 +475,7 @@ msgid "Dark"
|
||||
msgstr "Dunkel"
|
||||
|
||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||
#: src/components/LabelForm.tsx:226
|
||||
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||
@@ -437,7 +492,7 @@ msgstr "Konto löschen"
|
||||
msgid "Delete board"
|
||||
msgstr "Board löschen"
|
||||
|
||||
#: src/views/card/components/Dropdown.tsx:14
|
||||
#: src/views/card/components/Dropdown.tsx:25
|
||||
msgid "Delete card"
|
||||
msgstr "Karte löschen"
|
||||
|
||||
@@ -455,6 +510,24 @@ msgstr "Liste löschen"
|
||||
msgid "Delete workspace"
|
||||
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
|
||||
msgid "Design"
|
||||
msgstr "Design"
|
||||
@@ -692,7 +765,7 @@ msgstr "Loslegen"
|
||||
msgid "Get started by creating a new board"
|
||||
msgstr "Beginne, indem du ein neues Board erstellst"
|
||||
|
||||
#: src/views/board/index.tsx:418
|
||||
#: src/views/board/index.tsx:417
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Beginne mit dem Erstellen einer neuen Liste"
|
||||
|
||||
@@ -849,7 +922,7 @@ msgstr "Kanban neu gedacht"
|
||||
msgid "Keep in mind that this action is irreversible."
|
||||
msgstr "Beachten Sie, dass diese Aktion nicht rückgängig gemacht werden kann."
|
||||
|
||||
#: src/views/card/index.tsx:113
|
||||
#: src/views/card/index.tsx:118
|
||||
#: src/views/board/components/NewCardForm.tsx:358
|
||||
#: src/views/board/components/Filters.tsx:101
|
||||
msgid "Labels"
|
||||
@@ -883,7 +956,7 @@ msgstr "Hell"
|
||||
msgid "Link copied"
|
||||
msgstr "Link kopiert"
|
||||
|
||||
#: src/views/card/index.tsx:105
|
||||
#: src/views/card/index.tsx:110
|
||||
msgid "List"
|
||||
msgstr "Liste"
|
||||
|
||||
@@ -911,12 +984,21 @@ msgstr "Niedrige Priorität"
|
||||
msgid "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
|
||||
msgid "Medium Priority"
|
||||
msgstr "Mittlere Priorität"
|
||||
|
||||
#: src/views/members/index.tsx:161
|
||||
#: src/views/card/index.tsx:121
|
||||
#: src/views/card/index.tsx:126
|
||||
#: src/views/board/components/NewCardForm.tsx:317
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/components/SideNavigation.tsx:73
|
||||
@@ -932,11 +1014,13 @@ msgstr "Mitglieder | {0}"
|
||||
msgid "Monthly"
|
||||
msgstr "Monatlich"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:81
|
||||
msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||
msgstr "hat die Karte von <0>{fromList}</0> nach <1>{toList}</1> verschoben"
|
||||
#. 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 "hat die Karte von <0>{0}</0> nach <1>{1}</1> verschoben"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:55
|
||||
#: src/views/card/components/ActivityList.tsx:64
|
||||
msgid "moved the card to another list"
|
||||
msgstr "hat die Karte in eine andere Liste verschoben"
|
||||
|
||||
@@ -961,6 +1045,10 @@ msgstr "Neues Board"
|
||||
msgid "New card"
|
||||
msgstr "Neue Karte"
|
||||
|
||||
#: src/views/card/components/NewChecklistForm.tsx:102
|
||||
msgid "New checklist"
|
||||
msgstr "Neue Checkliste"
|
||||
|
||||
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
||||
msgid "New import"
|
||||
msgstr "Neuer Import"
|
||||
@@ -969,7 +1057,7 @@ msgstr "Neuer Import"
|
||||
msgid "New label"
|
||||
msgstr "Neues Label"
|
||||
|
||||
#: src/views/board/index.tsx:395
|
||||
#: src/views/board/index.tsx:394
|
||||
#: src/views/board/components/NewListForm.tsx:112
|
||||
msgid "New list"
|
||||
msgstr "Neue Liste"
|
||||
@@ -1002,7 +1090,7 @@ msgstr "Keine Boards gefunden"
|
||||
msgid "No credit card required"
|
||||
msgstr "Keine Kreditkarte erforderlich"
|
||||
|
||||
#: src/views/board/index.tsx:415
|
||||
#: src/views/board/index.tsx:414
|
||||
msgid "No lists"
|
||||
msgstr "Keine Listen"
|
||||
|
||||
@@ -1085,17 +1173,23 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
|
||||
#: src/views/settings/components/Avatar.tsx:98
|
||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/card/index.tsx:159
|
||||
#: src/views/card/index.tsx:173
|
||||
#: 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/ListSelector.tsx:53
|
||||
#: src/views/card/components/LabelSelector.tsx:73
|
||||
#: 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/Comment.tsx:64
|
||||
#: 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/board/index.tsx:135
|
||||
#: src/views/board/index.tsx:191
|
||||
#: src/views/board/index.tsx:134
|
||||
#: src/views/board/index.tsx:190
|
||||
#: src/views/board/components/VisibilityButton.tsx:53
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
#: src/views/board/components/NewListForm.tsx:78
|
||||
@@ -1168,17 +1262,32 @@ msgstr "Entfernen"
|
||||
msgid "Remove member"
|
||||
msgstr "Mitglied entfernen"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:57
|
||||
#: src/views/card/components/ActivityList.tsx:66
|
||||
msgid "removed a label from the card"
|
||||
msgstr "hat ein Label von der Karte entfernt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:59
|
||||
#: src/views/card/components/ActivityList.tsx:68
|
||||
msgid "removed a member from the card"
|
||||
msgstr "hat ein Mitglied von der Karte entfernt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed label <0>{label}</0>"
|
||||
msgstr "hat Label <0>{label}</0> entfernt"
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:138
|
||||
msgid "removed label <0>{0}</0>"
|
||||
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
|
||||
msgid "Research"
|
||||
@@ -1241,7 +1350,7 @@ msgstr "Selbst hosten"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Selbst hosten mit Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
msgid "self-assigned the card"
|
||||
msgstr "hat sich selbst die Karte zugewiesen"
|
||||
|
||||
@@ -1360,6 +1469,7 @@ msgid "They won't be able to access this workspace."
|
||||
msgstr "Sie werden keinen Zugriff mehr auf diesen Workspace haben."
|
||||
|
||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||
msgid "This action can't be undone."
|
||||
@@ -1410,6 +1520,10 @@ msgstr "Trello-importe"
|
||||
msgid "Triaging"
|
||||
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
|
||||
msgid "Unable to add comment"
|
||||
msgstr "Kommentar konnte nicht hinzugefügt werden"
|
||||
@@ -1418,6 +1532,10 @@ msgstr "Kommentar konnte nicht hinzugefügt werden"
|
||||
msgid "Unable to create card"
|
||||
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
|
||||
msgid "Unable to create list"
|
||||
msgstr "Liste konnte nicht erstellt werden"
|
||||
@@ -1430,6 +1548,14 @@ msgstr "Workspace konnte nicht erstellt werden"
|
||||
msgid "Unable to delete card"
|
||||
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
|
||||
msgid "Unable to delete comment"
|
||||
msgstr "Kommentar konnte nicht gelöscht werden"
|
||||
@@ -1450,11 +1576,19 @@ msgstr "Board-URL kann nicht aktualisiert werden"
|
||||
msgid "Unable to update board visibility"
|
||||
msgstr "Board-Sichtbarkeit konnte nicht aktualisiert werden"
|
||||
|
||||
#: src/views/card/index.tsx:158
|
||||
#: src/views/board/index.tsx:190
|
||||
#: src/views/card/index.tsx:172
|
||||
#: src/views/board/index.tsx:189
|
||||
msgid "Unable to update card"
|
||||
msgstr "Karte konnte nicht aktualisiert werden"
|
||||
|
||||
#: src/views/card/components/ChecklistNameInput.tsx:45
|
||||
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"
|
||||
msgstr "Kommentar konnte nicht aktualisiert werden"
|
||||
@@ -1464,7 +1598,7 @@ msgid "Unable to update labels"
|
||||
msgstr "Labels konnten nicht aktualisiert werden"
|
||||
|
||||
#: src/views/card/components/ListSelector.tsx:52
|
||||
#: src/views/board/index.tsx:134
|
||||
#: src/views/board/index.tsx:133
|
||||
msgid "Unable to update list"
|
||||
msgstr "Liste konnte nicht aktualisiert werden"
|
||||
|
||||
@@ -1472,11 +1606,12 @@ msgstr "Liste konnte nicht aktualisiert werden"
|
||||
msgid "Unable to update members"
|
||||
msgstr "Mitglieder konnten nicht aktualisiert werden"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
msgid "unassigned <0>{memberName}</0> from the card"
|
||||
msgstr "<0>{memberName}</0> von der Karte entfernt"
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "hat <0>{0}</0> von der Karte entfernt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:99
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "hat sich selbst von der Karte entfernt"
|
||||
|
||||
@@ -1516,17 +1651,22 @@ msgstr "Aktualisieren"
|
||||
msgid "Update label"
|
||||
msgstr "Label aktualisieren"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:54
|
||||
#: src/views/card/components/ActivityList.tsx:73
|
||||
msgid "updated a checklist item"
|
||||
msgstr "hat ein Checklistenelement aktualisiert"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:63
|
||||
msgid "updated the description"
|
||||
msgstr "hat die Beschreibung aktualisiert"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:53
|
||||
#: src/views/card/components/ActivityList.tsx:62
|
||||
msgid "updated the title"
|
||||
msgstr "hat den Titel aktualisiert"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:73
|
||||
msgid "updated the title to <0>{toTitle}</0>"
|
||||
msgstr "hat den Titel zu <0>{toTitle}</0> aktualisiert"
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:90
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "hat den Titel in <0>{0}</0> geändert"
|
||||
|
||||
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
||||
msgid "Upgrade"
|
||||
@@ -1621,7 +1761,7 @@ msgstr "Als Trello 2011 auf den markt kam, beeindruckte es alle mit seiner sorgf
|
||||
msgid "Why make an open source Trello?"
|
||||
msgstr "Warum ein open source Trello entwickeln?"
|
||||
|
||||
#: src/views/board/index.tsx:332
|
||||
#: src/views/board/index.tsx:331
|
||||
msgid "Workspace"
|
||||
msgstr "Arbeitsbereich"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -23,7 +23,7 @@ msgstr ", or see our"
|
||||
|
||||
#. placeholder {0}: card?.title ?? "Card"
|
||||
#. placeholder {1}: board?.name ?? "Board"
|
||||
#: src/views/card/index.tsx:189
|
||||
#: src/views/card/index.tsx:214
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
@@ -60,8 +60,8 @@ msgstr "A powerful, flexible kanban app that helps you organise work, track prog
|
||||
msgid "Account deleted"
|
||||
msgstr "Account deleted"
|
||||
|
||||
#: src/views/public/board/CardModal.tsx:128
|
||||
#: src/views/card/index.tsx:256
|
||||
#: src/views/public/board/CardModal.tsx:136
|
||||
#: src/views/card/index.tsx:287
|
||||
msgid "Activity"
|
||||
msgstr "Activity"
|
||||
|
||||
@@ -78,10 +78,22 @@ msgstr "Add a card"
|
||||
msgid "Add a comment..."
|
||||
msgstr "Add a comment..."
|
||||
|
||||
#: src/components/Editor.tsx:303
|
||||
#: src/views/card/components/NewChecklistItemForm.tsx:140
|
||||
msgid "Add an item..."
|
||||
msgstr "Add an item..."
|
||||
|
||||
#: src/views/card/components/Dropdown.tsx:18
|
||||
msgid "Add checklist"
|
||||
msgstr "Add checklist"
|
||||
|
||||
#: 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:118
|
||||
msgid "Add label"
|
||||
@@ -92,17 +104,40 @@ msgstr "Add label"
|
||||
msgid "Add member"
|
||||
msgstr "Add member"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:56
|
||||
#: src/views/card/components/ActivityList.tsx:69
|
||||
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"
|
||||
msgstr "added a label to the card"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:58
|
||||
#: src/views/card/components/ActivityList.tsx:67
|
||||
msgid "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
|
||||
msgid "added label <0>{label}</0>"
|
||||
msgstr "added label <0>{label}</0>"
|
||||
#~ msgid "added label <0>{label}</0>"
|
||||
#~ msgstr "added label <0>{label}</0>"
|
||||
|
||||
#: src/views/home/components/Pricing.tsx:55
|
||||
msgid "Admin roles"
|
||||
@@ -157,6 +192,10 @@ msgstr "Are you sure you want to delete the workspace {0}?"
|
||||
msgid "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
|
||||
msgid "Are you sure you want to delete this comment?"
|
||||
msgstr "Are you sure you want to delete this comment?"
|
||||
@@ -169,9 +208,14 @@ msgstr "Are you sure you want to delete this label?"
|
||||
msgid "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
|
||||
msgid "assigned <0>{memberName}</0> to the card"
|
||||
msgstr "assigned <0>{memberName}</0> to the card"
|
||||
#~ msgid "assigned <0>{memberName}</0> to the card"
|
||||
#~ msgstr "assigned <0>{memberName}</0> to the card"
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:46
|
||||
msgid "Awaiting Customer"
|
||||
@@ -202,7 +246,7 @@ msgstr "Billing portal"
|
||||
msgid "Blog Post"
|
||||
msgstr "Blog Post"
|
||||
|
||||
#: src/views/board/index.tsx:332
|
||||
#: src/views/board/index.tsx:331
|
||||
msgid "Board"
|
||||
msgstr "Board"
|
||||
|
||||
@@ -219,7 +263,7 @@ msgid "Board name is required"
|
||||
msgstr "Board name is required"
|
||||
|
||||
#: src/views/public/board/index.tsx:143
|
||||
#: src/views/board/index.tsx:358
|
||||
#: src/views/board/index.tsx:357
|
||||
msgid "Board not found"
|
||||
msgstr "Board not found"
|
||||
|
||||
@@ -278,13 +322,14 @@ msgstr "Bug Report"
|
||||
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
||||
#: 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/Comment.tsx:158
|
||||
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||
msgid "Cancel"
|
||||
msgstr "Cancel"
|
||||
|
||||
#: src/views/card/index.tsx:234
|
||||
#: src/views/card/index.tsx:259
|
||||
msgid "Card not found"
|
||||
msgstr "Card not found"
|
||||
|
||||
@@ -301,6 +346,10 @@ msgstr "Change the language of the app."
|
||||
msgid "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
|
||||
msgid "Clear filters"
|
||||
msgstr "Clear filters"
|
||||
@@ -338,6 +387,15 @@ msgstr "Complete"
|
||||
msgid "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
|
||||
msgid "Confirm URL change"
|
||||
msgstr "Confirm URL change"
|
||||
@@ -402,6 +460,10 @@ msgstr "Create board"
|
||||
msgid "Create card"
|
||||
msgstr "Create card"
|
||||
|
||||
#: src/views/card/components/NewChecklistForm.tsx:134
|
||||
msgid "Create checklist"
|
||||
msgstr "Create checklist"
|
||||
|
||||
#: src/components/LabelForm.tsx:236
|
||||
msgid "Create label"
|
||||
msgstr "Create label"
|
||||
@@ -423,7 +485,7 @@ msgstr "Create new key"
|
||||
msgid "Create new label"
|
||||
msgstr "Create new label"
|
||||
|
||||
#: src/views/board/index.tsx:426
|
||||
#: src/views/board/index.tsx:425
|
||||
msgid "Create new list"
|
||||
msgstr "Create new list"
|
||||
|
||||
@@ -432,7 +494,7 @@ msgstr "Create new list"
|
||||
msgid "Create workspace"
|
||||
msgstr "Create workspace"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:52
|
||||
#: src/views/card/components/ActivityList.tsx:61
|
||||
msgid "created the card"
|
||||
msgstr "created the card"
|
||||
|
||||
@@ -457,6 +519,7 @@ msgid "Dark"
|
||||
msgstr "Dark"
|
||||
|
||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||
#: src/components/LabelForm.tsx:226
|
||||
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||
@@ -473,7 +536,7 @@ msgstr "Delete account"
|
||||
msgid "Delete board"
|
||||
msgstr "Delete board"
|
||||
|
||||
#: src/views/card/components/Dropdown.tsx:14
|
||||
#: src/views/card/components/Dropdown.tsx:25
|
||||
msgid "Delete card"
|
||||
msgstr "Delete card"
|
||||
|
||||
@@ -491,6 +554,24 @@ msgstr "Delete list"
|
||||
msgid "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
|
||||
msgid "Design"
|
||||
msgstr "Design"
|
||||
@@ -729,7 +810,7 @@ msgstr "Get Started"
|
||||
msgid "Get started by creating a new board"
|
||||
msgstr "Get started by creating a new board"
|
||||
|
||||
#: src/views/board/index.tsx:418
|
||||
#: src/views/board/index.tsx:417
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Get started by creating a new list"
|
||||
|
||||
@@ -890,7 +971,7 @@ msgstr "Kanban reimagined"
|
||||
msgid "Keep in mind that this action is irreversible."
|
||||
msgstr "Keep in mind that this action is irreversible."
|
||||
|
||||
#: src/views/card/index.tsx:113
|
||||
#: src/views/card/index.tsx:118
|
||||
#: src/views/board/components/NewCardForm.tsx:358
|
||||
#: src/views/board/components/Filters.tsx:101
|
||||
msgid "Labels"
|
||||
@@ -924,7 +1005,7 @@ msgstr "Light"
|
||||
msgid "Link copied"
|
||||
msgstr "Link copied"
|
||||
|
||||
#: src/views/card/index.tsx:105
|
||||
#: src/views/card/index.tsx:110
|
||||
msgid "List"
|
||||
msgstr "List"
|
||||
|
||||
@@ -952,12 +1033,21 @@ msgstr "Low Priority"
|
||||
msgid "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
|
||||
msgid "Medium Priority"
|
||||
msgstr "Medium Priority"
|
||||
|
||||
#: src/views/members/index.tsx:161
|
||||
#: src/views/card/index.tsx:121
|
||||
#: src/views/card/index.tsx:126
|
||||
#: src/views/board/components/NewCardForm.tsx:317
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/components/SideNavigation.tsx:73
|
||||
@@ -973,11 +1063,17 @@ msgstr "Members | {0}"
|
||||
msgid "Monthly"
|
||||
msgstr "Monthly"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:81
|
||||
msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||
msgstr "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||
#. 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:55
|
||||
#: src/views/card/components/ActivityList.tsx:81
|
||||
#~ msgid "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
|
||||
msgid "moved the card to another list"
|
||||
msgstr "moved the card to another list"
|
||||
|
||||
@@ -1002,6 +1098,10 @@ msgstr "New board"
|
||||
msgid "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
|
||||
msgid "New import"
|
||||
msgstr "New import"
|
||||
@@ -1010,7 +1110,7 @@ msgstr "New import"
|
||||
msgid "New label"
|
||||
msgstr "New label"
|
||||
|
||||
#: src/views/board/index.tsx:395
|
||||
#: src/views/board/index.tsx:394
|
||||
#: src/views/board/components/NewListForm.tsx:112
|
||||
msgid "New list"
|
||||
msgstr "New list"
|
||||
@@ -1047,7 +1147,7 @@ msgstr "No boards found"
|
||||
msgid "No credit card required"
|
||||
msgstr "No credit card required"
|
||||
|
||||
#: src/views/board/index.tsx:415
|
||||
#: src/views/board/index.tsx:414
|
||||
msgid "No lists"
|
||||
msgstr "No lists"
|
||||
|
||||
@@ -1130,17 +1230,23 @@ msgstr "Please select a file to upload."
|
||||
#: src/views/settings/components/Avatar.tsx:98
|
||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/card/index.tsx:159
|
||||
#: src/views/card/index.tsx:173
|
||||
#: 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/ListSelector.tsx:53
|
||||
#: src/views/card/components/LabelSelector.tsx:73
|
||||
#: 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/Comment.tsx:64
|
||||
#: 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/board/index.tsx:135
|
||||
#: src/views/board/index.tsx:191
|
||||
#: src/views/board/index.tsx:134
|
||||
#: src/views/board/index.tsx:190
|
||||
#: src/views/board/components/VisibilityButton.tsx:53
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
#: src/views/board/components/NewListForm.tsx:78
|
||||
@@ -1213,17 +1319,36 @@ msgstr "Remove"
|
||||
msgid "Remove member"
|
||||
msgstr "Remove member"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:57
|
||||
#: src/views/card/components/ActivityList.tsx:66
|
||||
msgid "removed a label from the card"
|
||||
msgstr "removed a label from the card"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:59
|
||||
#: src/views/card/components/ActivityList.tsx:68
|
||||
msgid "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
|
||||
msgid "removed label <0>{label}</0>"
|
||||
msgstr "removed label <0>{label}</0>"
|
||||
#~ msgid "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
|
||||
msgid "Research"
|
||||
@@ -1286,7 +1411,7 @@ msgstr "Self Host"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Self host with Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
msgid "self-assigned the card"
|
||||
msgstr "self-assigned the card"
|
||||
|
||||
@@ -1409,6 +1534,7 @@ msgid "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/DeleteChecklistConfirmation.tsx:58
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||
msgid "This action can't be undone."
|
||||
@@ -1463,6 +1589,10 @@ msgstr "Trello imports"
|
||||
msgid "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
|
||||
msgid "Unable to add comment"
|
||||
msgstr "Unable to add comment"
|
||||
@@ -1471,6 +1601,10 @@ msgstr "Unable to add comment"
|
||||
msgid "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
|
||||
msgid "Unable to create list"
|
||||
msgstr "Unable to create list"
|
||||
@@ -1483,6 +1617,14 @@ msgstr "Unable to create workspace"
|
||||
msgid "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
|
||||
msgid "Unable to delete comment"
|
||||
msgstr "Unable to delete comment"
|
||||
@@ -1503,11 +1645,19 @@ msgstr "Unable to update board URL"
|
||||
msgid "Unable to update board visibility"
|
||||
msgstr "Unable to update board visibility"
|
||||
|
||||
#: src/views/card/index.tsx:158
|
||||
#: src/views/board/index.tsx:190
|
||||
#: src/views/card/index.tsx:172
|
||||
#: src/views/board/index.tsx:189
|
||||
msgid "Unable to update card"
|
||||
msgstr "Unable to update card"
|
||||
|
||||
#: src/views/card/components/ChecklistNameInput.tsx:45
|
||||
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"
|
||||
msgstr "Unable to update comment"
|
||||
@@ -1517,7 +1667,7 @@ msgid "Unable to update labels"
|
||||
msgstr "Unable to update labels"
|
||||
|
||||
#: src/views/card/components/ListSelector.tsx:52
|
||||
#: src/views/board/index.tsx:134
|
||||
#: src/views/board/index.tsx:133
|
||||
msgid "Unable to update list"
|
||||
msgstr "Unable to update list"
|
||||
|
||||
@@ -1525,11 +1675,16 @@ msgstr "Unable to update list"
|
||||
msgid "Unable to update members"
|
||||
msgstr "Unable to update members"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
msgid "unassigned <0>{memberName}</0> from the card"
|
||||
msgstr "unassigned <0>{memberName}</0> from the card"
|
||||
#. 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:99
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
#~ msgid "unassigned <0>{memberName}</0> from the card"
|
||||
#~ msgstr "unassigned <0>{memberName}</0> from the card"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "unassigned themselves from the card"
|
||||
|
||||
@@ -1569,17 +1724,26 @@ msgstr "Update"
|
||||
msgid "Update label"
|
||||
msgstr "Update label"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:54
|
||||
#: src/views/card/components/ActivityList.tsx:73
|
||||
msgid "updated a checklist item"
|
||||
msgstr "updated a checklist item"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:63
|
||||
msgid "updated the description"
|
||||
msgstr "updated the description"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:53
|
||||
#: src/views/card/components/ActivityList.tsx:62
|
||||
msgid "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
|
||||
msgid "updated the title to <0>{toTitle}</0>"
|
||||
msgstr "updated the title to <0>{toTitle}</0>"
|
||||
#~ msgid "updated the title to <0>{toTitle}</0>"
|
||||
#~ msgstr "updated the title to <0>{toTitle}</0>"
|
||||
|
||||
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
||||
msgid "Upgrade"
|
||||
@@ -1678,7 +1842,7 @@ msgstr "When Trello launched in 2011, it blew everyone away with its carefully d
|
||||
msgid "Why make an open source Trello?"
|
||||
msgstr "Why make an open source Trello?"
|
||||
|
||||
#: src/views/board/index.tsx:332
|
||||
#: src/views/board/index.tsx:331
|
||||
msgid "Workspace"
|
||||
msgstr "Workspace"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -23,7 +23,7 @@ msgstr ", o consulta nuestra"
|
||||
|
||||
#. placeholder {0}: card?.title ?? "Card"
|
||||
#. placeholder {1}: board?.name ?? "Board"
|
||||
#: src/views/card/index.tsx:189
|
||||
#: src/views/card/index.tsx:214
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
@@ -48,8 +48,8 @@ msgstr "Una aplicación kanban potente y flexible que te ayuda a organizar el tr
|
||||
msgid "Account deleted"
|
||||
msgstr "Cuenta eliminada"
|
||||
|
||||
#: src/views/public/board/CardModal.tsx:128
|
||||
#: src/views/card/index.tsx:256
|
||||
#: src/views/public/board/CardModal.tsx:136
|
||||
#: src/views/card/index.tsx:287
|
||||
msgid "Activity"
|
||||
msgstr "Actividad"
|
||||
|
||||
@@ -66,10 +66,22 @@ msgstr "Añadir una tarjeta"
|
||||
msgid "Add a comment..."
|
||||
msgstr "Añadir un comentario..."
|
||||
|
||||
#: src/components/Editor.tsx:303
|
||||
#: src/views/card/components/NewChecklistItemForm.tsx:140
|
||||
msgid "Add an item..."
|
||||
msgstr "Añadir un elemento..."
|
||||
|
||||
#: src/views/card/components/Dropdown.tsx:18
|
||||
msgid "Add checklist"
|
||||
msgstr "Añadir lista de verificación"
|
||||
|
||||
#: src/components/Editor.tsx:308
|
||||
msgid "Add description... (type '/' to open commands)"
|
||||
msgstr "Añadir descripción... (escribe '/' para abrir comandos)"
|
||||
|
||||
#: 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:118
|
||||
msgid "Add label"
|
||||
@@ -80,17 +92,36 @@ msgstr "Añadir etiqueta"
|
||||
msgid "Add member"
|
||||
msgstr "Añadir miembro"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:56
|
||||
#: src/views/card/components/ActivityList.tsx:69
|
||||
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"
|
||||
msgstr "añadió una etiqueta a la tarjeta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:58
|
||||
#: src/views/card/components/ActivityList.tsx:67
|
||||
msgid "added a member to the card"
|
||||
msgstr "añadió un miembro a la tarjeta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
msgid "added label <0>{label}</0>"
|
||||
msgstr "añadió la etiqueta <0>{label}</0>"
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
msgid "added checklist <0>{0}</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
|
||||
msgid "Admin roles"
|
||||
@@ -141,6 +172,10 @@ msgstr "¿Estás seguro de que quieres eliminar el espacio de trabajo {0}?"
|
||||
msgid "Are you sure you want to delete this card?"
|
||||
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
|
||||
msgid "Are you sure you want to delete this comment?"
|
||||
msgstr "¿Estás seguro de que quieres eliminar este comentario?"
|
||||
@@ -153,9 +188,10 @@ msgstr "¿Estás seguro de que quieres eliminar esta etiqueta?"
|
||||
msgid "Are you sure you want to delete your account?"
|
||||
msgstr "¿Estás seguro de que quieres eliminar tu cuenta?"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
msgid "assigned <0>{memberName}</0> to the card"
|
||||
msgstr "asignó a <0>{memberName}</0> a la tarjeta"
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "asignó <0>{0}</0> a la tarjeta"
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:46
|
||||
msgid "Awaiting Customer"
|
||||
@@ -182,7 +218,7 @@ msgstr "Portal de facturación"
|
||||
msgid "Blog Post"
|
||||
msgstr "Entrada de blog"
|
||||
|
||||
#: src/views/board/index.tsx:332
|
||||
#: src/views/board/index.tsx:331
|
||||
msgid "Board"
|
||||
msgstr "Tablero"
|
||||
|
||||
@@ -195,7 +231,7 @@ msgid "Board name is required"
|
||||
msgstr "El nombre del tablero es obligatorio"
|
||||
|
||||
#: src/views/public/board/index.tsx:143
|
||||
#: src/views/board/index.tsx:358
|
||||
#: src/views/board/index.tsx:357
|
||||
msgid "Board not found"
|
||||
msgstr "Tablero no encontrado"
|
||||
|
||||
@@ -250,13 +286,14 @@ msgstr "Informe de error"
|
||||
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
||||
#: 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/Comment.tsx:158
|
||||
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#: src/views/card/index.tsx:234
|
||||
#: src/views/card/index.tsx:259
|
||||
msgid "Card not found"
|
||||
msgstr "Tarjeta no encontrada"
|
||||
|
||||
@@ -273,6 +310,10 @@ msgstr "Cambiar el idioma de la aplicación."
|
||||
msgid "Check your inbox"
|
||||
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
|
||||
msgid "Clear filters"
|
||||
msgstr "Borrar filtros"
|
||||
@@ -310,6 +351,15 @@ msgstr "Completado"
|
||||
msgid "Complete control and ownership:"
|
||||
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
|
||||
msgid "Confirm URL change"
|
||||
msgstr "Confirmar cambio de URL"
|
||||
@@ -366,6 +416,10 @@ msgstr "Crear tablero"
|
||||
msgid "Create card"
|
||||
msgstr "Crear tarjeta"
|
||||
|
||||
#: src/views/card/components/NewChecklistForm.tsx:134
|
||||
msgid "Create checklist"
|
||||
msgstr "Crear lista de verificación"
|
||||
|
||||
#: src/components/LabelForm.tsx:236
|
||||
msgid "Create label"
|
||||
msgstr "Crear etiqueta"
|
||||
@@ -387,7 +441,7 @@ msgstr "Crear nueva clave"
|
||||
msgid "Create new label"
|
||||
msgstr "Crear nueva etiqueta"
|
||||
|
||||
#: src/views/board/index.tsx:426
|
||||
#: src/views/board/index.tsx:425
|
||||
msgid "Create new list"
|
||||
msgstr "Crear nueva lista"
|
||||
|
||||
@@ -396,7 +450,7 @@ msgstr "Crear nueva lista"
|
||||
msgid "Create workspace"
|
||||
msgstr "Crear espacio de trabajo"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:52
|
||||
#: src/views/card/components/ActivityList.tsx:61
|
||||
msgid "created the card"
|
||||
msgstr "creó la tarjeta"
|
||||
|
||||
@@ -421,6 +475,7 @@ msgid "Dark"
|
||||
msgstr "Oscuro"
|
||||
|
||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||
#: src/components/LabelForm.tsx:226
|
||||
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||
@@ -437,7 +492,7 @@ msgstr "Eliminar cuenta"
|
||||
msgid "Delete board"
|
||||
msgstr "Eliminar tablero"
|
||||
|
||||
#: src/views/card/components/Dropdown.tsx:14
|
||||
#: src/views/card/components/Dropdown.tsx:25
|
||||
msgid "Delete card"
|
||||
msgstr "Eliminar tarjeta"
|
||||
|
||||
@@ -455,6 +510,24 @@ msgstr "Eliminar lista"
|
||||
msgid "Delete workspace"
|
||||
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
|
||||
msgid "Design"
|
||||
msgstr "Diseño"
|
||||
@@ -692,7 +765,7 @@ msgstr "Comenzar"
|
||||
msgid "Get started by creating a new board"
|
||||
msgstr "Comienza creando un nuevo tablero"
|
||||
|
||||
#: src/views/board/index.tsx:418
|
||||
#: src/views/board/index.tsx:417
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Comienza creando una nueva lista"
|
||||
|
||||
@@ -849,7 +922,7 @@ msgstr "Kanban reinventado"
|
||||
msgid "Keep in mind that this action is irreversible."
|
||||
msgstr "Ten en cuenta que esta acción es irreversible."
|
||||
|
||||
#: src/views/card/index.tsx:113
|
||||
#: src/views/card/index.tsx:118
|
||||
#: src/views/board/components/NewCardForm.tsx:358
|
||||
#: src/views/board/components/Filters.tsx:101
|
||||
msgid "Labels"
|
||||
@@ -883,7 +956,7 @@ msgstr "Claro"
|
||||
msgid "Link copied"
|
||||
msgstr "Enlace copiado"
|
||||
|
||||
#: src/views/card/index.tsx:105
|
||||
#: src/views/card/index.tsx:110
|
||||
msgid "List"
|
||||
msgstr "Lista"
|
||||
|
||||
@@ -911,12 +984,21 @@ msgstr "Prioridad baja"
|
||||
msgid "magic link"
|
||||
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
|
||||
msgid "Medium Priority"
|
||||
msgstr "Prioridad media"
|
||||
|
||||
#: src/views/members/index.tsx:161
|
||||
#: src/views/card/index.tsx:121
|
||||
#: src/views/card/index.tsx:126
|
||||
#: src/views/board/components/NewCardForm.tsx:317
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/components/SideNavigation.tsx:73
|
||||
@@ -932,11 +1014,13 @@ msgstr "Miembros | {0}"
|
||||
msgid "Monthly"
|
||||
msgstr "Mensual"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:81
|
||||
msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||
msgstr "movió la tarjeta de <0>{fromList}</0> a<1>{toList}</1>"
|
||||
#. 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 "movió la tarjeta de <0>{0}</0> a<1>{1}</1>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:55
|
||||
#: src/views/card/components/ActivityList.tsx:64
|
||||
msgid "moved the card to another list"
|
||||
msgstr "movió la tarjeta a otra lista"
|
||||
|
||||
@@ -961,6 +1045,10 @@ msgstr "Nuevo tablero"
|
||||
msgid "New card"
|
||||
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
|
||||
msgid "New import"
|
||||
msgstr "Nueva importación"
|
||||
@@ -969,7 +1057,7 @@ msgstr "Nueva importación"
|
||||
msgid "New label"
|
||||
msgstr "Nueva etiqueta"
|
||||
|
||||
#: src/views/board/index.tsx:395
|
||||
#: src/views/board/index.tsx:394
|
||||
#: src/views/board/components/NewListForm.tsx:112
|
||||
msgid "New list"
|
||||
msgstr "Nueva lista"
|
||||
@@ -1002,7 +1090,7 @@ msgstr "No se encontraron tableros"
|
||||
msgid "No credit card required"
|
||||
msgstr "No se requiere tarjeta de crédito"
|
||||
|
||||
#: src/views/board/index.tsx:415
|
||||
#: src/views/board/index.tsx:414
|
||||
msgid "No lists"
|
||||
msgstr "Sin listas"
|
||||
|
||||
@@ -1085,17 +1173,23 @@ msgstr "Por favor selecciona un archivo para subir."
|
||||
#: src/views/settings/components/Avatar.tsx:98
|
||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/card/index.tsx:159
|
||||
#: src/views/card/index.tsx:173
|
||||
#: 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/ListSelector.tsx:53
|
||||
#: src/views/card/components/LabelSelector.tsx:73
|
||||
#: 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/Comment.tsx:64
|
||||
#: 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/board/index.tsx:135
|
||||
#: src/views/board/index.tsx:191
|
||||
#: src/views/board/index.tsx:134
|
||||
#: src/views/board/index.tsx:190
|
||||
#: src/views/board/components/VisibilityButton.tsx:53
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
#: src/views/board/components/NewListForm.tsx:78
|
||||
@@ -1168,17 +1262,32 @@ msgstr "Eliminar"
|
||||
msgid "Remove member"
|
||||
msgstr "Eliminar miembro"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:57
|
||||
#: src/views/card/components/ActivityList.tsx:66
|
||||
msgid "removed a label from the card"
|
||||
msgstr "eliminó una etiqueta de la tarjeta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:59
|
||||
#: src/views/card/components/ActivityList.tsx:68
|
||||
msgid "removed a member from the card"
|
||||
msgstr "eliminó un miembro de la tarjeta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed label <0>{label}</0>"
|
||||
msgstr "eliminó la etiqueta <0>{label}</0>"
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:138
|
||||
msgid "removed label <0>{0}</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
|
||||
msgid "Research"
|
||||
@@ -1241,7 +1350,7 @@ msgstr "Autoalojamiento"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Autoalojamiento con Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
msgid "self-assigned the card"
|
||||
msgstr "se autoasignó la tarjeta"
|
||||
|
||||
@@ -1360,6 +1469,7 @@ msgid "They won't be able to access this workspace."
|
||||
msgstr "No podrán acceder a este espacio de trabajo."
|
||||
|
||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||
msgid "This action can't be undone."
|
||||
@@ -1410,6 +1520,10 @@ msgstr "Importaciones de Trello"
|
||||
msgid "Triaging"
|
||||
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
|
||||
msgid "Unable to add comment"
|
||||
msgstr "No se puede añadir el comentario"
|
||||
@@ -1418,6 +1532,10 @@ msgstr "No se puede añadir el comentario"
|
||||
msgid "Unable to create card"
|
||||
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
|
||||
msgid "Unable to create list"
|
||||
msgstr "No se puede crear la lista"
|
||||
@@ -1430,6 +1548,14 @@ msgstr "No se puede crear el espacio de trabajo"
|
||||
msgid "Unable to delete card"
|
||||
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
|
||||
msgid "Unable to delete comment"
|
||||
msgstr "No se puede eliminar el comentario"
|
||||
@@ -1450,11 +1576,19 @@ msgstr "No se puede actualizar la URL del tablero"
|
||||
msgid "Unable to update board visibility"
|
||||
msgstr "No se puede actualizar la visibilidad del tablero"
|
||||
|
||||
#: src/views/card/index.tsx:158
|
||||
#: src/views/board/index.tsx:190
|
||||
#: src/views/card/index.tsx:172
|
||||
#: src/views/board/index.tsx:189
|
||||
msgid "Unable to update card"
|
||||
msgstr "No se puede actualizar la tarjeta"
|
||||
|
||||
#: src/views/card/components/ChecklistNameInput.tsx:45
|
||||
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"
|
||||
msgstr "No se puede actualizar el comentario"
|
||||
@@ -1464,7 +1598,7 @@ msgid "Unable to update labels"
|
||||
msgstr "No se pueden actualizar las etiquetas"
|
||||
|
||||
#: src/views/card/components/ListSelector.tsx:52
|
||||
#: src/views/board/index.tsx:134
|
||||
#: src/views/board/index.tsx:133
|
||||
msgid "Unable to update list"
|
||||
msgstr "No se puede actualizar la lista"
|
||||
|
||||
@@ -1472,11 +1606,12 @@ msgstr "No se puede actualizar la lista"
|
||||
msgid "Unable to update members"
|
||||
msgstr "No se pueden actualizar los miembros"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
msgid "unassigned <0>{memberName}</0> from the card"
|
||||
msgstr "desasignó a <0>{memberName}</0> de la tarjeta"
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "desasignó <0>{0}</0> de la tarjeta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:99
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "se desasignó de la tarjeta"
|
||||
|
||||
@@ -1516,17 +1651,22 @@ msgstr "Actualizar"
|
||||
msgid "Update label"
|
||||
msgstr "Actualizar etiqueta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:54
|
||||
#: src/views/card/components/ActivityList.tsx:73
|
||||
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"
|
||||
msgstr "actualizó la descripción"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:53
|
||||
#: src/views/card/components/ActivityList.tsx:62
|
||||
msgid "updated the title"
|
||||
msgstr "actualizó el título"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:73
|
||||
msgid "updated the title to <0>{toTitle}</0>"
|
||||
msgstr "actualizó el título a <0>{toTitle}</0>"
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:90
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "actualizó el título a <0>{0}</0>"
|
||||
|
||||
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
||||
msgid "Upgrade"
|
||||
@@ -1621,7 +1761,7 @@ msgstr "Cuando Trello se lanzó en 2011, impresionó a todos con su simplicidad
|
||||
msgid "Why make an open source Trello?"
|
||||
msgstr "¿Por qué crear un Trello de código abierto?"
|
||||
|
||||
#: src/views/board/index.tsx:332
|
||||
#: src/views/board/index.tsx:331
|
||||
msgid "Workspace"
|
||||
msgstr "Espacio de trabajo"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -23,7 +23,7 @@ msgstr ", ou consultez notre"
|
||||
|
||||
#. placeholder {0}: card?.title ?? "Card"
|
||||
#. placeholder {1}: board?.name ?? "Board"
|
||||
#: src/views/card/index.tsx:189
|
||||
#: src/views/card/index.tsx:214
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
@@ -48,8 +48,8 @@ msgstr "Une application kanban puissante et flexible qui vous aide à organiser
|
||||
msgid "Account deleted"
|
||||
msgstr "Compte supprimé"
|
||||
|
||||
#: src/views/public/board/CardModal.tsx:128
|
||||
#: src/views/card/index.tsx:256
|
||||
#: src/views/public/board/CardModal.tsx:136
|
||||
#: src/views/card/index.tsx:287
|
||||
msgid "Activity"
|
||||
msgstr "Activité"
|
||||
|
||||
@@ -66,10 +66,22 @@ msgstr "Ajouter une carte"
|
||||
msgid "Add a comment..."
|
||||
msgstr "Ajouter un commentaire..."
|
||||
|
||||
#: src/components/Editor.tsx:303
|
||||
#: src/views/card/components/NewChecklistItemForm.tsx:140
|
||||
msgid "Add an item..."
|
||||
msgstr "Ajouter un élément..."
|
||||
|
||||
#: src/views/card/components/Dropdown.tsx:18
|
||||
msgid "Add checklist"
|
||||
msgstr "Ajouter une checklist"
|
||||
|
||||
#: src/components/Editor.tsx:308
|
||||
msgid "Add description... (type '/' to open commands)"
|
||||
msgstr "Ajouter une description... (tapez '/' pour ouvrir les commandes)"
|
||||
|
||||
#: 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:118
|
||||
msgid "Add label"
|
||||
@@ -80,17 +92,36 @@ msgstr "Ajouter une étiquette"
|
||||
msgid "Add member"
|
||||
msgstr "Ajouter un membre"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:56
|
||||
#: src/views/card/components/ActivityList.tsx:69
|
||||
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"
|
||||
msgstr "a ajouté une étiquette à la carte"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:58
|
||||
#: src/views/card/components/ActivityList.tsx:67
|
||||
msgid "added a member to the card"
|
||||
msgstr "a ajouté un membre à la carte"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
msgid "added label <0>{label}</0>"
|
||||
msgstr "a ajouté l'étiquette <0>{label}</0>"
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
msgid "added checklist <0>{0}</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
|
||||
msgid "Admin roles"
|
||||
@@ -141,6 +172,10 @@ msgstr "Êtes-vous sûr de vouloir supprimer l'espace de travail {0} ?"
|
||||
msgid "Are you sure you want to delete this card?"
|
||||
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
|
||||
msgid "Are you sure you want to delete this comment?"
|
||||
msgstr "Êtes-vous sûr de vouloir supprimer ce commentaire ?"
|
||||
@@ -153,9 +188,10 @@ msgstr "Êtes-vous sûr de vouloir supprimer cette étiquette ?"
|
||||
msgid "Are you sure you want to delete your account?"
|
||||
msgstr "Êtes-vous sûr de vouloir supprimer votre compte ?"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
msgid "assigned <0>{memberName}</0> to the card"
|
||||
msgstr "a assigné <0>{memberName}</0> à la carte"
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "a assigné <0>{0}</0> à la carte"
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:46
|
||||
msgid "Awaiting Customer"
|
||||
@@ -182,7 +218,7 @@ msgstr "Portail de facturation"
|
||||
msgid "Blog Post"
|
||||
msgstr "Article de blog"
|
||||
|
||||
#: src/views/board/index.tsx:332
|
||||
#: src/views/board/index.tsx:331
|
||||
msgid "Board"
|
||||
msgstr "Tableau"
|
||||
|
||||
@@ -195,7 +231,7 @@ msgid "Board name is required"
|
||||
msgstr "Le nom du tableau est requis"
|
||||
|
||||
#: src/views/public/board/index.tsx:143
|
||||
#: src/views/board/index.tsx:358
|
||||
#: src/views/board/index.tsx:357
|
||||
msgid "Board not found"
|
||||
msgstr "Tableau introuvable"
|
||||
|
||||
@@ -250,13 +286,14 @@ msgstr "Rapport de bug"
|
||||
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
||||
#: 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/Comment.tsx:158
|
||||
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||
msgid "Cancel"
|
||||
msgstr "Annuler"
|
||||
|
||||
#: src/views/card/index.tsx:234
|
||||
#: src/views/card/index.tsx:259
|
||||
msgid "Card not found"
|
||||
msgstr "Carte introuvable"
|
||||
|
||||
@@ -273,6 +310,10 @@ msgstr "Changer la langue de l'application."
|
||||
msgid "Check your inbox"
|
||||
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
|
||||
msgid "Clear filters"
|
||||
msgstr "Effacer les filtres"
|
||||
@@ -310,6 +351,15 @@ msgstr "Terminé"
|
||||
msgid "Complete control and ownership:"
|
||||
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
|
||||
msgid "Confirm URL change"
|
||||
msgstr "Confirmer le changement d'URL"
|
||||
@@ -366,6 +416,10 @@ msgstr "Créer un tableau"
|
||||
msgid "Create card"
|
||||
msgstr "Créer une carte"
|
||||
|
||||
#: src/views/card/components/NewChecklistForm.tsx:134
|
||||
msgid "Create checklist"
|
||||
msgstr "Créer une checklist"
|
||||
|
||||
#: src/components/LabelForm.tsx:236
|
||||
msgid "Create label"
|
||||
msgstr "Créer une étiquette"
|
||||
@@ -387,7 +441,7 @@ msgstr "Créer une nouvelle clé"
|
||||
msgid "Create new label"
|
||||
msgstr "Créer une nouvelle étiquette"
|
||||
|
||||
#: src/views/board/index.tsx:426
|
||||
#: src/views/board/index.tsx:425
|
||||
msgid "Create new list"
|
||||
msgstr "Créer une nouvelle liste"
|
||||
|
||||
@@ -396,7 +450,7 @@ msgstr "Créer une nouvelle liste"
|
||||
msgid "Create workspace"
|
||||
msgstr "Créer un espace de travail"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:52
|
||||
#: src/views/card/components/ActivityList.tsx:61
|
||||
msgid "created the card"
|
||||
msgstr "a créé la carte"
|
||||
|
||||
@@ -421,6 +475,7 @@ msgid "Dark"
|
||||
msgstr "Sombre"
|
||||
|
||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||
#: src/components/LabelForm.tsx:226
|
||||
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||
@@ -437,7 +492,7 @@ msgstr "Supprimer le compte"
|
||||
msgid "Delete board"
|
||||
msgstr "Supprimer le tableau"
|
||||
|
||||
#: src/views/card/components/Dropdown.tsx:14
|
||||
#: src/views/card/components/Dropdown.tsx:25
|
||||
msgid "Delete card"
|
||||
msgstr "Supprimer la carte"
|
||||
|
||||
@@ -455,6 +510,24 @@ msgstr "Supprimer la liste"
|
||||
msgid "Delete workspace"
|
||||
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
|
||||
msgid "Design"
|
||||
msgstr "Design"
|
||||
@@ -692,7 +765,7 @@ msgstr "Commencer"
|
||||
msgid "Get started by creating a new board"
|
||||
msgstr "Commencez par créer un nouveau tableau"
|
||||
|
||||
#: src/views/board/index.tsx:418
|
||||
#: src/views/board/index.tsx:417
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Commencez par créer une nouvelle liste"
|
||||
|
||||
@@ -849,7 +922,7 @@ 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/card/index.tsx:113
|
||||
#: src/views/card/index.tsx:118
|
||||
#: src/views/board/components/NewCardForm.tsx:358
|
||||
#: src/views/board/components/Filters.tsx:101
|
||||
msgid "Labels"
|
||||
@@ -883,7 +956,7 @@ msgstr "Clair"
|
||||
msgid "Link copied"
|
||||
msgstr "Lien copié"
|
||||
|
||||
#: src/views/card/index.tsx:105
|
||||
#: src/views/card/index.tsx:110
|
||||
msgid "List"
|
||||
msgstr "Liste"
|
||||
|
||||
@@ -911,12 +984,21 @@ msgstr "Priorité basse"
|
||||
msgid "magic link"
|
||||
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
|
||||
msgid "Medium Priority"
|
||||
msgstr "Priorité moyenne"
|
||||
|
||||
#: src/views/members/index.tsx:161
|
||||
#: src/views/card/index.tsx:121
|
||||
#: src/views/card/index.tsx:126
|
||||
#: src/views/board/components/NewCardForm.tsx:317
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/components/SideNavigation.tsx:73
|
||||
@@ -932,11 +1014,13 @@ msgstr "Membres | {0}"
|
||||
msgid "Monthly"
|
||||
msgstr "Mensuel"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:81
|
||||
msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||
msgstr "a déplacé la carte de <0>{fromList}</0> vers<1>{toList}</1>"
|
||||
#. 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 "a déplacé la carte de <0>{0}</0> vers <1>{1}</1>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:55
|
||||
#: src/views/card/components/ActivityList.tsx:64
|
||||
msgid "moved the card to another list"
|
||||
msgstr "a déplacé la carte vers une autre liste"
|
||||
|
||||
@@ -961,6 +1045,10 @@ msgstr "Nouveau tableau"
|
||||
msgid "New card"
|
||||
msgstr "Nouvelle carte"
|
||||
|
||||
#: src/views/card/components/NewChecklistForm.tsx:102
|
||||
msgid "New checklist"
|
||||
msgstr "Nouvelle checklist"
|
||||
|
||||
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
||||
msgid "New import"
|
||||
msgstr "Nouvel import"
|
||||
@@ -969,7 +1057,7 @@ msgstr "Nouvel import"
|
||||
msgid "New label"
|
||||
msgstr "Nouvelle étiquette"
|
||||
|
||||
#: src/views/board/index.tsx:395
|
||||
#: src/views/board/index.tsx:394
|
||||
#: src/views/board/components/NewListForm.tsx:112
|
||||
msgid "New list"
|
||||
msgstr "Nouvelle liste"
|
||||
@@ -1002,7 +1090,7 @@ msgstr "Aucun tableau trouvé"
|
||||
msgid "No credit card required"
|
||||
msgstr "Aucune carte de crédit requise"
|
||||
|
||||
#: src/views/board/index.tsx:415
|
||||
#: src/views/board/index.tsx:414
|
||||
msgid "No lists"
|
||||
msgstr "Aucune liste"
|
||||
|
||||
@@ -1085,17 +1173,23 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
|
||||
#: src/views/settings/components/Avatar.tsx:98
|
||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/card/index.tsx:159
|
||||
#: src/views/card/index.tsx:173
|
||||
#: 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/ListSelector.tsx:53
|
||||
#: src/views/card/components/LabelSelector.tsx:73
|
||||
#: 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/Comment.tsx:64
|
||||
#: 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/board/index.tsx:135
|
||||
#: src/views/board/index.tsx:191
|
||||
#: src/views/board/index.tsx:134
|
||||
#: src/views/board/index.tsx:190
|
||||
#: src/views/board/components/VisibilityButton.tsx:53
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
#: src/views/board/components/NewListForm.tsx:78
|
||||
@@ -1168,17 +1262,32 @@ msgstr "Supprimer"
|
||||
msgid "Remove member"
|
||||
msgstr "Supprimer le membre"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:57
|
||||
#: src/views/card/components/ActivityList.tsx:66
|
||||
msgid "removed a label from the card"
|
||||
msgstr "a supprimé une étiquette de la carte"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:59
|
||||
#: src/views/card/components/ActivityList.tsx:68
|
||||
msgid "removed a member from the card"
|
||||
msgstr "a retiré un membre de la carte"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed label <0>{label}</0>"
|
||||
msgstr "a supprimé l'étiquette <0>{label}</0>"
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:138
|
||||
msgid "removed label <0>{0}</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
|
||||
msgid "Research"
|
||||
@@ -1241,7 +1350,7 @@ msgstr "Auto-hébergement"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Auto-hébergement avec Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
msgid "self-assigned the card"
|
||||
msgstr "s'est auto-assigné la carte"
|
||||
|
||||
@@ -1360,6 +1469,7 @@ msgid "They won't be able to access this workspace."
|
||||
msgstr "Ils ne pourront plus accéder à cet espace de travail."
|
||||
|
||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||
msgid "This action can't be undone."
|
||||
@@ -1410,6 +1520,10 @@ msgstr "Importations Trello"
|
||||
msgid "Triaging"
|
||||
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
|
||||
msgid "Unable to add comment"
|
||||
msgstr "Impossible d'ajouter un commentaire"
|
||||
@@ -1418,6 +1532,10 @@ msgstr "Impossible d'ajouter un commentaire"
|
||||
msgid "Unable to create card"
|
||||
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
|
||||
msgid "Unable to create list"
|
||||
msgstr "Impossible de créer une liste"
|
||||
@@ -1430,6 +1548,14 @@ msgstr "Impossible de créer l'espace de travail"
|
||||
msgid "Unable to delete card"
|
||||
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
|
||||
msgid "Unable to delete comment"
|
||||
msgstr "Impossible de supprimer le commentaire"
|
||||
@@ -1450,11 +1576,19 @@ msgstr "Impossible de mettre à jour l'URL du tableau"
|
||||
msgid "Unable to update board visibility"
|
||||
msgstr "Impossible de mettre à jour la visibilité du tableau"
|
||||
|
||||
#: src/views/card/index.tsx:158
|
||||
#: src/views/board/index.tsx:190
|
||||
#: src/views/card/index.tsx:172
|
||||
#: src/views/board/index.tsx:189
|
||||
msgid "Unable to update card"
|
||||
msgstr "Impossible de mettre à jour la carte"
|
||||
|
||||
#: src/views/card/components/ChecklistNameInput.tsx:45
|
||||
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"
|
||||
msgstr "Impossible de mettre à jour le commentaire"
|
||||
@@ -1464,7 +1598,7 @@ msgid "Unable to update labels"
|
||||
msgstr "Impossible de mettre à jour les étiquettes"
|
||||
|
||||
#: src/views/card/components/ListSelector.tsx:52
|
||||
#: src/views/board/index.tsx:134
|
||||
#: src/views/board/index.tsx:133
|
||||
msgid "Unable to update list"
|
||||
msgstr "Impossible de mettre à jour la liste"
|
||||
|
||||
@@ -1472,11 +1606,12 @@ msgstr "Impossible de mettre à jour la liste"
|
||||
msgid "Unable to update members"
|
||||
msgstr "Impossible de mettre à jour les membres"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
msgid "unassigned <0>{memberName}</0> from the card"
|
||||
msgstr "a retiré <0>{memberName}</0> de la carte"
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "a désassigné <0>{0}</0> de la carte"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:99
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "s'est retiré de la carte"
|
||||
|
||||
@@ -1516,17 +1651,22 @@ msgstr "Mettre à jour"
|
||||
msgid "Update label"
|
||||
msgstr "Mettre à jour l'étiquette"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:54
|
||||
#: src/views/card/components/ActivityList.tsx:73
|
||||
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"
|
||||
msgstr "a mis à jour la description"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:53
|
||||
#: src/views/card/components/ActivityList.tsx:62
|
||||
msgid "updated the title"
|
||||
msgstr "a mis à jour le titre"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:73
|
||||
msgid "updated the title to <0>{toTitle}</0>"
|
||||
msgstr "a mis à jour le titre en <0>{toTitle}</0>"
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:90
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "a mis à jour le titre en <0>{0}</0>"
|
||||
|
||||
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
||||
msgid "Upgrade"
|
||||
@@ -1621,7 +1761,7 @@ msgstr "Quand Trello a été lancé en 2011, il a impressionné tout le monde pa
|
||||
msgid "Why make an open source Trello?"
|
||||
msgstr "Pourquoi créer un Trello open source ?"
|
||||
|
||||
#: src/views/board/index.tsx:332
|
||||
#: src/views/board/index.tsx:331
|
||||
msgid "Workspace"
|
||||
msgstr "Espace de travail"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -23,7 +23,7 @@ msgstr ", o consulta i nostri"
|
||||
|
||||
#. placeholder {0}: card?.title ?? "Card"
|
||||
#. placeholder {1}: board?.name ?? "Board"
|
||||
#: src/views/card/index.tsx:189
|
||||
#: src/views/card/index.tsx:214
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
@@ -48,8 +48,8 @@ msgstr "Un'app kanban potente e flessibile che ti aiuta a organizzare il lavoro,
|
||||
msgid "Account deleted"
|
||||
msgstr "Account eliminato"
|
||||
|
||||
#: src/views/public/board/CardModal.tsx:128
|
||||
#: src/views/card/index.tsx:256
|
||||
#: src/views/public/board/CardModal.tsx:136
|
||||
#: src/views/card/index.tsx:287
|
||||
msgid "Activity"
|
||||
msgstr "Attività"
|
||||
|
||||
@@ -66,10 +66,22 @@ msgstr "Aggiungi una carta"
|
||||
msgid "Add a comment..."
|
||||
msgstr "Aggiungi un commento..."
|
||||
|
||||
#: src/components/Editor.tsx:303
|
||||
#: src/views/card/components/NewChecklistItemForm.tsx:140
|
||||
msgid "Add an item..."
|
||||
msgstr "Aggiungi un elemento..."
|
||||
|
||||
#: src/views/card/components/Dropdown.tsx:18
|
||||
msgid "Add checklist"
|
||||
msgstr "Aggiungi checklist"
|
||||
|
||||
#: src/components/Editor.tsx:308
|
||||
msgid "Add description... (type '/' to open commands)"
|
||||
msgstr "Aggiungi descrizione... (digita '/' per aprire i comandi)"
|
||||
|
||||
#: 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:118
|
||||
msgid "Add label"
|
||||
@@ -80,17 +92,36 @@ msgstr "Aggiungi etichetta"
|
||||
msgid "Add member"
|
||||
msgstr "Aggiungi membro"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:56
|
||||
#: src/views/card/components/ActivityList.tsx:69
|
||||
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"
|
||||
msgstr "ha aggiunto un'etichetta alla carta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:58
|
||||
#: src/views/card/components/ActivityList.tsx:67
|
||||
msgid "added a member to the card"
|
||||
msgstr "ha aggiunto un membro alla carta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
msgid "added label <0>{label}</0>"
|
||||
msgstr "ha aggiunto l'etichetta <0>{label}</0>"
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
msgid "added checklist <0>{0}</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
|
||||
msgid "Admin roles"
|
||||
@@ -141,6 +172,10 @@ msgstr "Sei sicuro di voler eliminare lo spazio di lavoro {0}?"
|
||||
msgid "Are you sure you want to delete this card?"
|
||||
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
|
||||
msgid "Are you sure you want to delete this comment?"
|
||||
msgstr "Sei sicuro di voler eliminare questo commento?"
|
||||
@@ -153,9 +188,10 @@ msgstr "Sei sicuro di voler eliminare questa etichetta?"
|
||||
msgid "Are you sure you want to delete your account?"
|
||||
msgstr "Sei sicuro di voler eliminare il tuo account?"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
msgid "assigned <0>{memberName}</0> to the card"
|
||||
msgstr "ha assegnato <0>{memberName}</0> alla carta"
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "ha assegnato <0>{0}</0> alla scheda"
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:46
|
||||
msgid "Awaiting Customer"
|
||||
@@ -182,7 +218,7 @@ msgstr "Portale di fatturazione"
|
||||
msgid "Blog Post"
|
||||
msgstr "Post del blog"
|
||||
|
||||
#: src/views/board/index.tsx:332
|
||||
#: src/views/board/index.tsx:331
|
||||
msgid "Board"
|
||||
msgstr "Bacheca"
|
||||
|
||||
@@ -195,7 +231,7 @@ msgid "Board name is required"
|
||||
msgstr "Il nome della bacheca è obbligatorio"
|
||||
|
||||
#: src/views/public/board/index.tsx:143
|
||||
#: src/views/board/index.tsx:358
|
||||
#: src/views/board/index.tsx:357
|
||||
msgid "Board not found"
|
||||
msgstr "Bacheca non trovata"
|
||||
|
||||
@@ -250,13 +286,14 @@ msgstr "Segnalazione bug"
|
||||
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
||||
#: 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/Comment.tsx:158
|
||||
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||
msgid "Cancel"
|
||||
msgstr "Annulla"
|
||||
|
||||
#: src/views/card/index.tsx:234
|
||||
#: src/views/card/index.tsx:259
|
||||
msgid "Card not found"
|
||||
msgstr "Carta non trovata"
|
||||
|
||||
@@ -273,6 +310,10 @@ msgstr "Cambia la lingua dell'app."
|
||||
msgid "Check your inbox"
|
||||
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
|
||||
msgid "Clear filters"
|
||||
msgstr "Cancella filtri"
|
||||
@@ -310,6 +351,15 @@ msgstr "Completato"
|
||||
msgid "Complete control and ownership:"
|
||||
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
|
||||
msgid "Confirm URL change"
|
||||
msgstr "Conferma modifica URL"
|
||||
@@ -366,6 +416,10 @@ msgstr "Crea bacheca"
|
||||
msgid "Create card"
|
||||
msgstr "Crea carta"
|
||||
|
||||
#: src/views/card/components/NewChecklistForm.tsx:134
|
||||
msgid "Create checklist"
|
||||
msgstr "Crea checklist"
|
||||
|
||||
#: src/components/LabelForm.tsx:236
|
||||
msgid "Create label"
|
||||
msgstr "Crea etichetta"
|
||||
@@ -387,7 +441,7 @@ msgstr "Crea nuova chiave"
|
||||
msgid "Create new label"
|
||||
msgstr "Crea nuova etichetta"
|
||||
|
||||
#: src/views/board/index.tsx:426
|
||||
#: src/views/board/index.tsx:425
|
||||
msgid "Create new list"
|
||||
msgstr "Crea nuova lista"
|
||||
|
||||
@@ -396,7 +450,7 @@ msgstr "Crea nuova lista"
|
||||
msgid "Create workspace"
|
||||
msgstr "Crea spazio di lavoro"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:52
|
||||
#: src/views/card/components/ActivityList.tsx:61
|
||||
msgid "created the card"
|
||||
msgstr "ha creato la carta"
|
||||
|
||||
@@ -421,6 +475,7 @@ msgid "Dark"
|
||||
msgstr "Scuro"
|
||||
|
||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||
#: src/components/LabelForm.tsx:226
|
||||
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||
@@ -437,7 +492,7 @@ msgstr "Elimina account"
|
||||
msgid "Delete board"
|
||||
msgstr "Elimina bacheca"
|
||||
|
||||
#: src/views/card/components/Dropdown.tsx:14
|
||||
#: src/views/card/components/Dropdown.tsx:25
|
||||
msgid "Delete card"
|
||||
msgstr "Elimina carta"
|
||||
|
||||
@@ -455,6 +510,24 @@ msgstr "Elimina lista"
|
||||
msgid "Delete workspace"
|
||||
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
|
||||
msgid "Design"
|
||||
msgstr "Design"
|
||||
@@ -692,7 +765,7 @@ msgstr "Inizia ora"
|
||||
msgid "Get started by creating a new board"
|
||||
msgstr "Inizia creando una nuova bacheca"
|
||||
|
||||
#: src/views/board/index.tsx:418
|
||||
#: src/views/board/index.tsx:417
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Inizia creando una nuova lista"
|
||||
|
||||
@@ -849,7 +922,7 @@ msgstr "Kanban reinventato"
|
||||
msgid "Keep in mind that this action is irreversible."
|
||||
msgstr "Tieni presente che questa azione è irreversibile."
|
||||
|
||||
#: src/views/card/index.tsx:113
|
||||
#: src/views/card/index.tsx:118
|
||||
#: src/views/board/components/NewCardForm.tsx:358
|
||||
#: src/views/board/components/Filters.tsx:101
|
||||
msgid "Labels"
|
||||
@@ -883,7 +956,7 @@ msgstr "Chiaro"
|
||||
msgid "Link copied"
|
||||
msgstr "Link copiato"
|
||||
|
||||
#: src/views/card/index.tsx:105
|
||||
#: src/views/card/index.tsx:110
|
||||
msgid "List"
|
||||
msgstr "Lista"
|
||||
|
||||
@@ -911,12 +984,21 @@ msgstr "Bassa priorità"
|
||||
msgid "magic link"
|
||||
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
|
||||
msgid "Medium Priority"
|
||||
msgstr "Media priorità"
|
||||
|
||||
#: src/views/members/index.tsx:161
|
||||
#: src/views/card/index.tsx:121
|
||||
#: src/views/card/index.tsx:126
|
||||
#: src/views/board/components/NewCardForm.tsx:317
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/components/SideNavigation.tsx:73
|
||||
@@ -932,11 +1014,13 @@ msgstr "Membri | {0}"
|
||||
msgid "Monthly"
|
||||
msgstr "Mensile"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:81
|
||||
msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||
msgstr "ha spostato la scheda da <0>{fromList}</0> a<1>{toList}</1>"
|
||||
#. 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 "ha spostato la scheda da <0>{0}</0> a<1>{1}</1>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:55
|
||||
#: src/views/card/components/ActivityList.tsx:64
|
||||
msgid "moved the card to another list"
|
||||
msgstr "ha spostato la scheda in un'altra lista"
|
||||
|
||||
@@ -961,6 +1045,10 @@ msgstr "Nuova bacheca"
|
||||
msgid "New card"
|
||||
msgstr "Nuova carta"
|
||||
|
||||
#: src/views/card/components/NewChecklistForm.tsx:102
|
||||
msgid "New checklist"
|
||||
msgstr "Nuova checklist"
|
||||
|
||||
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
||||
msgid "New import"
|
||||
msgstr "Nuova importazione"
|
||||
@@ -969,7 +1057,7 @@ msgstr "Nuova importazione"
|
||||
msgid "New label"
|
||||
msgstr "Nuova etichetta"
|
||||
|
||||
#: src/views/board/index.tsx:395
|
||||
#: src/views/board/index.tsx:394
|
||||
#: src/views/board/components/NewListForm.tsx:112
|
||||
msgid "New list"
|
||||
msgstr "Nuova lista"
|
||||
@@ -1002,7 +1090,7 @@ msgstr "Nessuna bacheca trovata"
|
||||
msgid "No credit card required"
|
||||
msgstr "Nessuna carta di credito richiesta"
|
||||
|
||||
#: src/views/board/index.tsx:415
|
||||
#: src/views/board/index.tsx:414
|
||||
msgid "No lists"
|
||||
msgstr "Nessuna lista"
|
||||
|
||||
@@ -1085,17 +1173,23 @@ msgstr "Seleziona un file da caricare."
|
||||
#: src/views/settings/components/Avatar.tsx:98
|
||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/card/index.tsx:159
|
||||
#: src/views/card/index.tsx:173
|
||||
#: 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/ListSelector.tsx:53
|
||||
#: src/views/card/components/LabelSelector.tsx:73
|
||||
#: 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/Comment.tsx:64
|
||||
#: 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/board/index.tsx:135
|
||||
#: src/views/board/index.tsx:191
|
||||
#: src/views/board/index.tsx:134
|
||||
#: src/views/board/index.tsx:190
|
||||
#: src/views/board/components/VisibilityButton.tsx:53
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
#: src/views/board/components/NewListForm.tsx:78
|
||||
@@ -1168,17 +1262,32 @@ msgstr "Rimuovi"
|
||||
msgid "Remove member"
|
||||
msgstr "Rimuovi membro"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:57
|
||||
#: src/views/card/components/ActivityList.tsx:66
|
||||
msgid "removed a label from the card"
|
||||
msgstr "ha rimosso un'etichetta dalla scheda"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:59
|
||||
#: src/views/card/components/ActivityList.tsx:68
|
||||
msgid "removed a member from the card"
|
||||
msgstr "ha rimosso un membro dalla scheda"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed label <0>{label}</0>"
|
||||
msgstr "ha rimosso l'etichetta <0>{label}</0>"
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:138
|
||||
msgid "removed label <0>{0}</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
|
||||
msgid "Research"
|
||||
@@ -1241,7 +1350,7 @@ msgstr "Self Host"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Self host con Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
msgid "self-assigned the card"
|
||||
msgstr "si è auto-assegnato la scheda"
|
||||
|
||||
@@ -1360,6 +1469,7 @@ msgid "They won't be able to access this workspace."
|
||||
msgstr "Non potranno accedere a questo spazio di lavoro."
|
||||
|
||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||
msgid "This action can't be undone."
|
||||
@@ -1410,6 +1520,10 @@ msgstr "Importazioni da Trello"
|
||||
msgid "Triaging"
|
||||
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
|
||||
msgid "Unable to add comment"
|
||||
msgstr "Impossibile aggiungere il commento"
|
||||
@@ -1418,6 +1532,10 @@ msgstr "Impossibile aggiungere il commento"
|
||||
msgid "Unable to create card"
|
||||
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
|
||||
msgid "Unable to create list"
|
||||
msgstr "Impossibile creare la lista"
|
||||
@@ -1430,6 +1548,14 @@ msgstr "Impossibile creare lo spazio di lavoro"
|
||||
msgid "Unable to delete card"
|
||||
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
|
||||
msgid "Unable to delete comment"
|
||||
msgstr "Impossibile eliminare il commento"
|
||||
@@ -1450,11 +1576,19 @@ msgstr "Impossibile aggiornare l'URL della bacheca"
|
||||
msgid "Unable to update board visibility"
|
||||
msgstr "Impossibile aggiornare la visibilità della bacheca"
|
||||
|
||||
#: src/views/card/index.tsx:158
|
||||
#: src/views/board/index.tsx:190
|
||||
#: src/views/card/index.tsx:172
|
||||
#: src/views/board/index.tsx:189
|
||||
msgid "Unable to update card"
|
||||
msgstr "Impossibile aggiornare la scheda"
|
||||
|
||||
#: src/views/card/components/ChecklistNameInput.tsx:45
|
||||
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"
|
||||
msgstr "Impossibile aggiornare il commento"
|
||||
@@ -1464,7 +1598,7 @@ msgid "Unable to update labels"
|
||||
msgstr "Impossibile aggiornare le etichette"
|
||||
|
||||
#: src/views/card/components/ListSelector.tsx:52
|
||||
#: src/views/board/index.tsx:134
|
||||
#: src/views/board/index.tsx:133
|
||||
msgid "Unable to update list"
|
||||
msgstr "Impossibile aggiornare la lista"
|
||||
|
||||
@@ -1472,11 +1606,12 @@ msgstr "Impossibile aggiornare la lista"
|
||||
msgid "Unable to update members"
|
||||
msgstr "Impossibile aggiornare i membri"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
msgid "unassigned <0>{memberName}</0> from the card"
|
||||
msgstr "ha rimosso l'assegnazione di <0>{memberName}</0> dalla scheda"
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "ha rimosso l'assegnazione di <0>{0}</0> dalla scheda"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:99
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "si è rimosso dall'assegnazione della scheda"
|
||||
|
||||
@@ -1516,17 +1651,22 @@ msgstr "Aggiorna"
|
||||
msgid "Update label"
|
||||
msgstr "Aggiorna etichetta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:54
|
||||
#: src/views/card/components/ActivityList.tsx:73
|
||||
msgid "updated a checklist item"
|
||||
msgstr "ha aggiornato un elemento della checklist"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:63
|
||||
msgid "updated the description"
|
||||
msgstr "ha aggiornato la descrizione"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:53
|
||||
#: src/views/card/components/ActivityList.tsx:62
|
||||
msgid "updated the title"
|
||||
msgstr "ha aggiornato il titolo"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:73
|
||||
msgid "updated the title to <0>{toTitle}</0>"
|
||||
msgstr "ha aggiornato il titolo in <0>{toTitle}</0>"
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:90
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "ha aggiornato il titolo in <0>{0}</0>"
|
||||
|
||||
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
||||
msgid "Upgrade"
|
||||
@@ -1621,7 +1761,7 @@ msgstr "Quando Trello fu lanciato nel 2011, stupì tutti con la sua semplicità
|
||||
msgid "Why make an open source Trello?"
|
||||
msgstr "Perché creare un Trello open source?"
|
||||
|
||||
#: src/views/board/index.tsx:332
|
||||
#: src/views/board/index.tsx:331
|
||||
msgid "Workspace"
|
||||
msgstr "Spazio di lavoro"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -23,7 +23,7 @@ msgstr ", of bekijk onze"
|
||||
|
||||
#. placeholder {0}: card?.title ?? "Card"
|
||||
#. placeholder {1}: board?.name ?? "Board"
|
||||
#: src/views/card/index.tsx:189
|
||||
#: src/views/card/index.tsx:214
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
@@ -48,8 +48,8 @@ msgstr "Een krachtige, flexibele kanban-app die je helpt werk te organiseren, vo
|
||||
msgid "Account deleted"
|
||||
msgstr "Account verwijderd"
|
||||
|
||||
#: src/views/public/board/CardModal.tsx:128
|
||||
#: src/views/card/index.tsx:256
|
||||
#: src/views/public/board/CardModal.tsx:136
|
||||
#: src/views/card/index.tsx:287
|
||||
msgid "Activity"
|
||||
msgstr "Activiteit"
|
||||
|
||||
@@ -66,10 +66,22 @@ msgstr "Voeg een kaart toe"
|
||||
msgid "Add a comment..."
|
||||
msgstr "Voeg een reactie toe..."
|
||||
|
||||
#: src/components/Editor.tsx:303
|
||||
#: src/views/card/components/NewChecklistItemForm.tsx:140
|
||||
msgid "Add an item..."
|
||||
msgstr "Voeg een item toe..."
|
||||
|
||||
#: src/views/card/components/Dropdown.tsx:18
|
||||
msgid "Add checklist"
|
||||
msgstr "Checklist toevoegen"
|
||||
|
||||
#: src/components/Editor.tsx:308
|
||||
msgid "Add description... (type '/' to open commands)"
|
||||
msgstr "Voeg beschrijving toe... (typ '/' om commando's te openen)"
|
||||
|
||||
#: 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:118
|
||||
msgid "Add label"
|
||||
@@ -80,17 +92,36 @@ msgstr "Label toevoegen"
|
||||
msgid "Add member"
|
||||
msgstr "Lid toevoegen"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:56
|
||||
#: src/views/card/components/ActivityList.tsx:69
|
||||
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"
|
||||
msgstr "heeft een label aan de kaart toegevoegd"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:58
|
||||
#: src/views/card/components/ActivityList.tsx:67
|
||||
msgid "added a member to the card"
|
||||
msgstr "heeft een lid aan de kaart toegevoegd"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
msgid "added label <0>{label}</0>"
|
||||
msgstr "heeft label <0>{label}</0> toegevoegd"
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
msgid "added checklist <0>{0}</0>"
|
||||
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
|
||||
msgid "Admin roles"
|
||||
@@ -141,6 +172,10 @@ msgstr "Weet je zeker dat je de werkruimte {0} wilt verwijderen?"
|
||||
msgid "Are you sure you want to delete this card?"
|
||||
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
|
||||
msgid "Are you sure you want to delete this comment?"
|
||||
msgstr "Weet je zeker dat je deze opmerking wilt verwijderen?"
|
||||
@@ -153,9 +188,10 @@ msgstr "Weet je zeker dat je dit label wilt verwijderen?"
|
||||
msgid "Are you sure you want to delete your account?"
|
||||
msgstr "Weet je zeker dat je je account wilt verwijderen?"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
msgid "assigned <0>{memberName}</0> to the card"
|
||||
msgstr "heeft <0>{memberName}</0> aan de kaart toegewezen"
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "heeft <0>{0}</0> aan de kaart toegewezen"
|
||||
|
||||
#: src/views/boards/components/TemplateBoards.tsx:46
|
||||
msgid "Awaiting Customer"
|
||||
@@ -182,7 +218,7 @@ msgstr "Factureringsportaal"
|
||||
msgid "Blog Post"
|
||||
msgstr "Blogbericht"
|
||||
|
||||
#: src/views/board/index.tsx:332
|
||||
#: src/views/board/index.tsx:331
|
||||
msgid "Board"
|
||||
msgstr "Bord"
|
||||
|
||||
@@ -195,7 +231,7 @@ msgid "Board name is required"
|
||||
msgstr "Bordnaam is verplicht"
|
||||
|
||||
#: src/views/public/board/index.tsx:143
|
||||
#: src/views/board/index.tsx:358
|
||||
#: src/views/board/index.tsx:357
|
||||
msgid "Board not found"
|
||||
msgstr "Bord niet gevonden"
|
||||
|
||||
@@ -250,13 +286,14 @@ msgstr "Bugrapport"
|
||||
#: src/views/settings/components/CustomURLConfirmation.tsx:50
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
|
||||
#: 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/Comment.tsx:158
|
||||
#: src/components/DeleteLabelConfirmation.tsx:47
|
||||
msgid "Cancel"
|
||||
msgstr "Annuleren"
|
||||
|
||||
#: src/views/card/index.tsx:234
|
||||
#: src/views/card/index.tsx:259
|
||||
msgid "Card not found"
|
||||
msgstr "Kaart niet gevonden"
|
||||
|
||||
@@ -273,6 +310,10 @@ msgstr "Wijzig de taal van de app."
|
||||
msgid "Check your 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
|
||||
msgid "Clear filters"
|
||||
msgstr "Filters wissen"
|
||||
@@ -310,6 +351,15 @@ msgstr "Voltooid"
|
||||
msgid "Complete control and ownership:"
|
||||
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
|
||||
msgid "Confirm URL change"
|
||||
msgstr "URL-wijziging bevestigen"
|
||||
@@ -366,6 +416,10 @@ msgstr "Maak bord"
|
||||
msgid "Create card"
|
||||
msgstr "Maak kaart"
|
||||
|
||||
#: src/views/card/components/NewChecklistForm.tsx:134
|
||||
msgid "Create checklist"
|
||||
msgstr "Checklist maken"
|
||||
|
||||
#: src/components/LabelForm.tsx:236
|
||||
msgid "Create label"
|
||||
msgstr "Maak label"
|
||||
@@ -387,7 +441,7 @@ msgstr "Nieuwe sleutel aanmaken"
|
||||
msgid "Create new label"
|
||||
msgstr "Maak nieuw label"
|
||||
|
||||
#: src/views/board/index.tsx:426
|
||||
#: src/views/board/index.tsx:425
|
||||
msgid "Create new list"
|
||||
msgstr "Maak nieuwe lijst"
|
||||
|
||||
@@ -396,7 +450,7 @@ msgstr "Maak nieuwe lijst"
|
||||
msgid "Create workspace"
|
||||
msgstr "Werkruimte maken"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:52
|
||||
#: src/views/card/components/ActivityList.tsx:61
|
||||
msgid "created the card"
|
||||
msgstr "heeft de kaart aangemaakt"
|
||||
|
||||
@@ -421,6 +475,7 @@ msgid "Dark"
|
||||
msgstr "Donker"
|
||||
|
||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
|
||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:92
|
||||
#: src/components/LabelForm.tsx:226
|
||||
#: src/components/DeleteLabelConfirmation.tsx:49
|
||||
@@ -437,7 +492,7 @@ msgstr "Account verwijderen"
|
||||
msgid "Delete board"
|
||||
msgstr "Board verwijderen"
|
||||
|
||||
#: src/views/card/components/Dropdown.tsx:14
|
||||
#: src/views/card/components/Dropdown.tsx:25
|
||||
msgid "Delete card"
|
||||
msgstr "Kaart verwijderen"
|
||||
|
||||
@@ -455,6 +510,24 @@ msgstr "Lijst verwijderen"
|
||||
msgid "Delete workspace"
|
||||
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
|
||||
msgid "Design"
|
||||
msgstr "Ontwerp"
|
||||
@@ -692,7 +765,7 @@ msgstr "Aan de slag"
|
||||
msgid "Get started by creating a new board"
|
||||
msgstr "Begin door een nieuw bord te maken"
|
||||
|
||||
#: src/views/board/index.tsx:418
|
||||
#: src/views/board/index.tsx:417
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Begin door een nieuwe lijst te maken"
|
||||
|
||||
@@ -849,7 +922,7 @@ 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/card/index.tsx:113
|
||||
#: src/views/card/index.tsx:118
|
||||
#: src/views/board/components/NewCardForm.tsx:358
|
||||
#: src/views/board/components/Filters.tsx:101
|
||||
msgid "Labels"
|
||||
@@ -883,7 +956,7 @@ msgstr "Licht"
|
||||
msgid "Link copied"
|
||||
msgstr "Link gekopieerd"
|
||||
|
||||
#: src/views/card/index.tsx:105
|
||||
#: src/views/card/index.tsx:110
|
||||
msgid "List"
|
||||
msgstr "Lijst"
|
||||
|
||||
@@ -911,12 +984,21 @@ msgstr "Lage prioriteit"
|
||||
msgid "magic 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
|
||||
msgid "Medium Priority"
|
||||
msgstr "Gemiddelde prioriteit"
|
||||
|
||||
#: src/views/members/index.tsx:161
|
||||
#: src/views/card/index.tsx:121
|
||||
#: src/views/card/index.tsx:126
|
||||
#: src/views/board/components/NewCardForm.tsx:317
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/components/SideNavigation.tsx:73
|
||||
@@ -932,11 +1014,13 @@ msgstr "Leden | {0}"
|
||||
msgid "Monthly"
|
||||
msgstr "Maandelijks"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:81
|
||||
msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||
msgstr "heeft de kaart verplaatst van <0>{fromList}</0> naar<1>{toList}</1>"
|
||||
#. 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 "heeft de kaart verplaatst van <0>{0}</0> naar<1>{1}</1>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:55
|
||||
#: src/views/card/components/ActivityList.tsx:64
|
||||
msgid "moved the card to another list"
|
||||
msgstr "heeft de kaart naar een andere lijst verplaatst"
|
||||
|
||||
@@ -961,6 +1045,10 @@ msgstr "Nieuw bord"
|
||||
msgid "New card"
|
||||
msgstr "Nieuwe kaart"
|
||||
|
||||
#: src/views/card/components/NewChecklistForm.tsx:102
|
||||
msgid "New checklist"
|
||||
msgstr "Nieuwe checklist"
|
||||
|
||||
#: src/views/boards/components/ImportBoardsForm.tsx:322
|
||||
msgid "New import"
|
||||
msgstr "Nieuwe import"
|
||||
@@ -969,7 +1057,7 @@ msgstr "Nieuwe import"
|
||||
msgid "New label"
|
||||
msgstr "Nieuw label"
|
||||
|
||||
#: src/views/board/index.tsx:395
|
||||
#: src/views/board/index.tsx:394
|
||||
#: src/views/board/components/NewListForm.tsx:112
|
||||
msgid "New list"
|
||||
msgstr "Nieuwe lijst"
|
||||
@@ -1002,7 +1090,7 @@ msgstr "Geen borden gevonden"
|
||||
msgid "No credit card required"
|
||||
msgstr "Geen creditcard vereist"
|
||||
|
||||
#: src/views/board/index.tsx:415
|
||||
#: src/views/board/index.tsx:414
|
||||
msgid "No lists"
|
||||
msgstr "Geen lijsten"
|
||||
|
||||
@@ -1085,17 +1173,23 @@ msgstr "Selecteer een bestand om te uploaden."
|
||||
#: src/views/settings/components/Avatar.tsx:98
|
||||
#: src/views/members/components/InviteMemberForm.tsx:64
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/card/index.tsx:159
|
||||
#: src/views/card/index.tsx:173
|
||||
#: 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/ListSelector.tsx:53
|
||||
#: src/views/card/components/LabelSelector.tsx:73
|
||||
#: 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/Comment.tsx:64
|
||||
#: 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/board/index.tsx:135
|
||||
#: src/views/board/index.tsx:191
|
||||
#: src/views/board/index.tsx:134
|
||||
#: src/views/board/index.tsx:190
|
||||
#: src/views/board/components/VisibilityButton.tsx:53
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
#: src/views/board/components/NewListForm.tsx:78
|
||||
@@ -1168,17 +1262,32 @@ msgstr "Verwijderen"
|
||||
msgid "Remove member"
|
||||
msgstr "Lid verwijderen"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:57
|
||||
#: src/views/card/components/ActivityList.tsx:66
|
||||
msgid "removed a label from the card"
|
||||
msgstr "heeft een label van de kaart verwijderd"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:59
|
||||
#: src/views/card/components/ActivityList.tsx:68
|
||||
msgid "removed a member from the card"
|
||||
msgstr "heeft een lid van de kaart verwijderd"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed label <0>{label}</0>"
|
||||
msgstr "heeft label <0>{label}</0> verwijderd"
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:138
|
||||
msgid "removed label <0>{0}</0>"
|
||||
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
|
||||
msgid "Research"
|
||||
@@ -1241,7 +1350,7 @@ msgstr "Zelf hosten"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Zelf hosten met Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
msgid "self-assigned the card"
|
||||
msgstr "heeft de kaart aan zichzelf toegewezen"
|
||||
|
||||
@@ -1360,6 +1469,7 @@ msgid "They won't be able to access this workspace."
|
||||
msgstr "Ze zullen geen toegang meer hebben tot deze werkruimte."
|
||||
|
||||
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
|
||||
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
|
||||
#: src/views/card/components/DeleteCardConfirmation.tsx:78
|
||||
#: src/components/DeleteLabelConfirmation.tsx:42
|
||||
msgid "This action can't be undone."
|
||||
@@ -1410,6 +1520,10 @@ msgstr "Trello-imports"
|
||||
msgid "Triaging"
|
||||
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
|
||||
msgid "Unable to add comment"
|
||||
msgstr "Kan geen reactie toevoegen"
|
||||
@@ -1418,6 +1532,10 @@ msgstr "Kan geen reactie toevoegen"
|
||||
msgid "Unable to create card"
|
||||
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
|
||||
msgid "Unable to create list"
|
||||
msgstr "Kan geen lijst maken"
|
||||
@@ -1430,6 +1548,14 @@ msgstr "Kan werkruimte niet aanmaken"
|
||||
msgid "Unable to delete card"
|
||||
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
|
||||
msgid "Unable to delete comment"
|
||||
msgstr "Kan opmerking niet verwijderen"
|
||||
@@ -1450,11 +1576,19 @@ msgstr "Kan board URL niet bijwerken"
|
||||
msgid "Unable to update board visibility"
|
||||
msgstr "Kan bordzichtbaarheid niet bijwerken"
|
||||
|
||||
#: src/views/card/index.tsx:158
|
||||
#: src/views/board/index.tsx:190
|
||||
#: src/views/card/index.tsx:172
|
||||
#: src/views/board/index.tsx:189
|
||||
msgid "Unable to update card"
|
||||
msgstr "Kan kaart niet bijwerken"
|
||||
|
||||
#: src/views/card/components/ChecklistNameInput.tsx:45
|
||||
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"
|
||||
msgstr "Kan reactie niet bijwerken"
|
||||
@@ -1464,7 +1598,7 @@ msgid "Unable to update labels"
|
||||
msgstr "Kan labels niet bijwerken"
|
||||
|
||||
#: src/views/card/components/ListSelector.tsx:52
|
||||
#: src/views/board/index.tsx:134
|
||||
#: src/views/board/index.tsx:133
|
||||
msgid "Unable to update list"
|
||||
msgstr "Kan lijst niet bijwerken"
|
||||
|
||||
@@ -1472,11 +1606,12 @@ msgstr "Kan lijst niet bijwerken"
|
||||
msgid "Unable to update members"
|
||||
msgstr "Kan leden niet bijwerken"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
msgid "unassigned <0>{memberName}</0> from the card"
|
||||
msgstr "<0>{memberName}</0> van de kaart verwijderd"
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "<0>{0}</0> van de kaart verwijderd"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:99
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "zichzelf van de kaart verwijderd"
|
||||
|
||||
@@ -1516,17 +1651,22 @@ msgstr "Bijwerken"
|
||||
msgid "Update label"
|
||||
msgstr "Label bijwerken"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:54
|
||||
#: src/views/card/components/ActivityList.tsx:73
|
||||
msgid "updated a checklist item"
|
||||
msgstr "een checklistitem bijgewerkt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:63
|
||||
msgid "updated the description"
|
||||
msgstr "beschrijving bijgewerkt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:53
|
||||
#: src/views/card/components/ActivityList.tsx:62
|
||||
msgid "updated the title"
|
||||
msgstr "titel bijgewerkt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:73
|
||||
msgid "updated the title to <0>{toTitle}</0>"
|
||||
msgstr "titel bijgewerkt naar <0>{toTitle}</0>"
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:90
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "titel bijgewerkt naar <0>{0}</0>"
|
||||
|
||||
#: src/views/settings/components/CustomURLConfirmation.tsx:52
|
||||
msgid "Upgrade"
|
||||
@@ -1621,7 +1761,7 @@ msgstr "Toen Trello in 2011 werd gelanceerd, blies het iedereen omver met zijn z
|
||||
msgid "Why make an open source Trello?"
|
||||
msgstr "Waarom een open source Trello maken?"
|
||||
|
||||
#: src/views/board/index.tsx:332
|
||||
#: src/views/board/index.tsx:331
|
||||
msgid "Workspace"
|
||||
msgstr "Werkruimte"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -10,7 +10,7 @@ interface Props {
|
||||
children: React.ReactNode;
|
||||
}
|
||||
|
||||
type ModalContextType = {
|
||||
interface ModalContextType {
|
||||
isOpen: boolean;
|
||||
openModal: (
|
||||
contentType: string,
|
||||
@@ -28,7 +28,7 @@ type ModalContextType = {
|
||||
getModalState: (modalType: string) => any;
|
||||
clearModalState: (modalType: string) => void;
|
||||
clearAllModalStates: () => void;
|
||||
};
|
||||
}
|
||||
|
||||
const ModalContext = createContext<ModalContextType | undefined>(undefined);
|
||||
|
||||
@@ -48,11 +48,11 @@ export const ModalProvider: React.FC<Props> = ({ children }) => {
|
||||
entityLabel?: string,
|
||||
) => {
|
||||
const newModal: ModalState = { contentType, entityId, entityLabel };
|
||||
setModalStack(prev => [...prev, newModal]);
|
||||
setModalStack((prev) => [...prev, newModal]);
|
||||
};
|
||||
|
||||
const closeModal = () => {
|
||||
setModalStack(prev => {
|
||||
setModalStack((prev) => {
|
||||
if (prev.length <= 1) {
|
||||
return [];
|
||||
}
|
||||
@@ -72,9 +72,9 @@ export const ModalProvider: React.FC<Props> = ({ children }) => {
|
||||
};
|
||||
|
||||
const setModalState = (modalType: string, state: any) => {
|
||||
setModalStates(prev => ({
|
||||
setModalStates((prev) => ({
|
||||
...prev,
|
||||
[modalType]: state
|
||||
[modalType]: state,
|
||||
}));
|
||||
};
|
||||
|
||||
@@ -83,7 +83,7 @@ export const ModalProvider: React.FC<Props> = ({ children }) => {
|
||||
};
|
||||
|
||||
const clearModalState = (modalType: string) => {
|
||||
setModalStates(prev => {
|
||||
setModalStates((prev) => {
|
||||
const newStates = { ...prev };
|
||||
delete newStates[modalType];
|
||||
return newStates;
|
||||
|
||||
@@ -45,10 +45,12 @@ export const formatMemberDisplayName = (
|
||||
return localPart.replace(/[_-]/g, ".");
|
||||
};
|
||||
|
||||
export const getAvatarUrl = (imageOrKey: string) => {
|
||||
export const getAvatarUrl = (imageOrKey: string | null) => {
|
||||
if (!imageOrKey) return "";
|
||||
|
||||
if (imageOrKey.startsWith("http://") || imageOrKey.startsWith("https://")) {
|
||||
return imageOrKey;
|
||||
}
|
||||
|
||||
|
||||
return `${env("NEXT_PUBLIC_STORAGE_URL")}/${env("NEXT_PUBLIC_AVATAR_BUCKET_NAME")}/${imageOrKey}`;
|
||||
};
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import Avatar from "~/components/Avatar";
|
||||
import Badge from "~/components/Badge";
|
||||
import CircularProgress from "~/components/CircularProgress";
|
||||
import LabelIcon from "~/components/LabelIcon";
|
||||
import { getAvatarUrl } from "~/utils/helpers";
|
||||
|
||||
@@ -7,6 +8,7 @@ const Card = ({
|
||||
title,
|
||||
labels,
|
||||
members,
|
||||
checklists,
|
||||
}: {
|
||||
title: string;
|
||||
labels: { name: string; colourCode: string | null }[];
|
||||
@@ -15,7 +17,28 @@ const Card = ({
|
||||
email: string;
|
||||
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 (
|
||||
<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>
|
||||
@@ -29,21 +52,37 @@ const Card = ({
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
<div className="isolate flex justify-end -space-x-1 overflow-hidden">
|
||||
{members.map(({ user, email }) => {
|
||||
const avatarUrl = user?.image
|
||||
? getAvatarUrl(user.image)
|
||||
: undefined;
|
||||
|
||||
return (
|
||||
<Avatar
|
||||
name={user?.name ?? ""}
|
||||
email={user?.email ?? email}
|
||||
imageUrl={avatarUrl}
|
||||
<div className="flex items-center justify-end gap-1">
|
||||
{checklists.length > 0 && (
|
||||
<div className="flex items-center gap-1 rounded-full border-[1px] border-light-300 px-2 py-1 dark:border-dark-600">
|
||||
<CircularProgress
|
||||
progress={progress || 2}
|
||||
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 (
|
||||
<Avatar
|
||||
name={user?.name ?? ""}
|
||||
email={user?.email ?? email}
|
||||
imageUrl={avatarUrl}
|
||||
size="sm"
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
@@ -13,7 +13,6 @@ import type { UpdateBoardInput } from "@kan/api/types";
|
||||
|
||||
import Button from "~/components/Button";
|
||||
import { DeleteLabelConfirmation } from "~/components/DeleteLabelConfirmation";
|
||||
import FeedbackModal from "~/components/FeedbackModal";
|
||||
import { LabelForm } from "~/components/LabelForm";
|
||||
import Modal from "~/components/modal";
|
||||
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
||||
@@ -238,15 +237,15 @@ export default function BoardPage() {
|
||||
const renderModalContent = () => {
|
||||
return (
|
||||
<>
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
isVisible={isOpen && modalContentType === "DELETE_BOARD"}
|
||||
>
|
||||
<DeleteBoardConfirmation boardPublicId={boardId ?? ""} />
|
||||
</Modal>
|
||||
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
isVisible={isOpen && modalContentType === "DELETE_LIST"}
|
||||
>
|
||||
<DeleteListConfirmation
|
||||
@@ -255,8 +254,8 @@ export default function BoardPage() {
|
||||
/>
|
||||
</Modal>
|
||||
|
||||
<Modal
|
||||
modalSize="md"
|
||||
<Modal
|
||||
modalSize="md"
|
||||
isVisible={isOpen && modalContentType === "NEW_CARD"}
|
||||
>
|
||||
<NewCardForm
|
||||
@@ -266,8 +265,8 @@ export default function BoardPage() {
|
||||
/>
|
||||
</Modal>
|
||||
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
isVisible={isOpen && modalContentType === "NEW_LIST"}
|
||||
>
|
||||
<NewListForm
|
||||
@@ -276,22 +275,22 @@ export default function BoardPage() {
|
||||
/>
|
||||
</Modal>
|
||||
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
isVisible={isOpen && modalContentType === "NEW_WORKSPACE"}
|
||||
>
|
||||
<NewWorkspaceForm />
|
||||
</Modal>
|
||||
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
isVisible={isOpen && modalContentType === "NEW_LABEL"}
|
||||
>
|
||||
<LabelForm boardPublicId={boardId ?? ""} refetch={refetchBoard} />
|
||||
</Modal>
|
||||
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
isVisible={isOpen && modalContentType === "EDIT_LABEL"}
|
||||
>
|
||||
<LabelForm
|
||||
@@ -301,8 +300,8 @@ export default function BoardPage() {
|
||||
/>
|
||||
</Modal>
|
||||
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
isVisible={isOpen && modalContentType === "DELETE_LABEL"}
|
||||
>
|
||||
<DeleteLabelConfirmation
|
||||
@@ -311,8 +310,8 @@ export default function BoardPage() {
|
||||
/>
|
||||
</Modal>
|
||||
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
<Modal
|
||||
modalSize="sm"
|
||||
isVisible={isOpen && modalContentType === "UPDATE_BOARD_SLUG"}
|
||||
>
|
||||
<UpdateBoardSlugForm
|
||||
@@ -492,6 +491,7 @@ export default function BoardPage() {
|
||||
title={card.title}
|
||||
labels={card.labels}
|
||||
members={card.members}
|
||||
checklists={card.checklists ?? []}
|
||||
/>
|
||||
</Link>
|
||||
)}
|
||||
|
||||
@@ -5,9 +5,11 @@ import { de, enGB, es, fr, it, nl } from "date-fns/locale";
|
||||
import {
|
||||
HiOutlineArrowLeft,
|
||||
HiOutlineArrowRight,
|
||||
HiOutlineCheckCircle,
|
||||
HiOutlinePencil,
|
||||
HiOutlinePlus,
|
||||
HiOutlineTag,
|
||||
HiOutlineTrash,
|
||||
HiOutlineUserMinus,
|
||||
HiOutlineUserPlus,
|
||||
} from "react-icons/hi2";
|
||||
@@ -31,6 +33,11 @@ const dateLocaleMap = {
|
||||
nl: nl,
|
||||
} 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 = ({
|
||||
type,
|
||||
toTitle,
|
||||
@@ -39,6 +46,7 @@ const getActivityText = ({
|
||||
memberName,
|
||||
isSelf,
|
||||
label,
|
||||
fromTitle,
|
||||
}: {
|
||||
type: ActivityType;
|
||||
toTitle: string | null;
|
||||
@@ -47,6 +55,7 @@ const getActivityText = ({
|
||||
memberName: string | null;
|
||||
isSelf: boolean;
|
||||
label: string | null;
|
||||
fromTitle?: string | null;
|
||||
}) => {
|
||||
const ACTIVITY_TYPE_MAP = {
|
||||
"card.created": t`created the card`,
|
||||
@@ -57,6 +66,14 @@ const getActivityText = ({
|
||||
"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.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;
|
||||
|
||||
if (!(type in ACTIVITY_TYPE_MAP)) return null;
|
||||
@@ -71,7 +88,7 @@ const getActivityText = ({
|
||||
if (type === "card.updated.title" && toTitle) {
|
||||
return (
|
||||
<Trans>
|
||||
updated the title to <TextHighlight>{toTitle}</TextHighlight>
|
||||
updated the title to <TextHighlight>{truncate(toTitle)}</TextHighlight>
|
||||
</Trans>
|
||||
);
|
||||
}
|
||||
@@ -79,8 +96,9 @@ const getActivityText = ({
|
||||
if (type === "card.updated.list" && fromList && toList) {
|
||||
return (
|
||||
<Trans>
|
||||
moved the card from <TextHighlight>{fromList}</TextHighlight> to
|
||||
<TextHighlight>{toList}</TextHighlight>
|
||||
moved the card from <TextHighlight>{truncate(fromList)}</TextHighlight>{" "}
|
||||
to
|
||||
<TextHighlight>{truncate(toList)}</TextHighlight>
|
||||
</Trans>
|
||||
);
|
||||
}
|
||||
@@ -90,7 +108,8 @@ const getActivityText = ({
|
||||
|
||||
return (
|
||||
<Trans>
|
||||
assigned <TextHighlight>{memberName}</TextHighlight> to the card
|
||||
assigned <TextHighlight>{truncate(memberName)}</TextHighlight> to the
|
||||
card
|
||||
</Trans>
|
||||
);
|
||||
}
|
||||
@@ -100,7 +119,8 @@ const getActivityText = ({
|
||||
|
||||
return (
|
||||
<Trans>
|
||||
unassigned <TextHighlight>{memberName}</TextHighlight> from the card
|
||||
unassigned <TextHighlight>{truncate(memberName)}</TextHighlight> from
|
||||
the card
|
||||
</Trans>
|
||||
);
|
||||
}
|
||||
@@ -108,7 +128,7 @@ const getActivityText = ({
|
||||
if (type === "card.updated.label.added" && label) {
|
||||
return (
|
||||
<Trans>
|
||||
added label <TextHighlight>{label}</TextHighlight>
|
||||
added label <TextHighlight>{truncate(label)}</TextHighlight>
|
||||
</Trans>
|
||||
);
|
||||
}
|
||||
@@ -116,7 +136,75 @@ const getActivityText = ({
|
||||
if (type === "card.updated.label.removed" && label) {
|
||||
return (
|
||||
<Trans>
|
||||
removed label <TextHighlight>{label}</TextHighlight>
|
||||
removed label <TextHighlight>{truncate(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>
|
||||
);
|
||||
}
|
||||
@@ -133,6 +221,14 @@ const ACTIVITY_ICON_MAP: Partial<Record<ActivityType, React.ReactNode | null>> =
|
||||
"card.updated.label.removed": <HiOutlineTag />,
|
||||
"card.updated.member.added": <HiOutlineUserPlus />,
|
||||
"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;
|
||||
|
||||
const getActivityIcon = (
|
||||
@@ -179,6 +275,7 @@ const ActivityList = ({
|
||||
memberName: activity.member?.user?.name ?? null,
|
||||
isSelf: activity.member?.user?.id === data?.user.id,
|
||||
label: activity.label?.name ?? null,
|
||||
fromTitle: activity.fromTitle ?? null,
|
||||
});
|
||||
|
||||
if (activity.type === "card.updated.comment.added")
|
||||
|
||||
197
apps/web/src/views/card/components/ChecklistItemRow.tsx
Normal file
197
apps/web/src/views/card/components/ChecklistItemRow.tsx
Normal file
@@ -0,0 +1,197 @@
|
||||
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>
|
||||
);
|
||||
}
|
||||
90
apps/web/src/views/card/components/ChecklistNameInput.tsx
Normal file
90
apps/web/src/views/card/components/ChecklistNameInput.tsx
Normal file
@@ -0,0 +1,90 @@
|
||||
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",
|
||||
)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
142
apps/web/src/views/card/components/Checklists.tsx
Normal file
142
apps/web/src/views/card/components/Checklists.tsx
Normal file
@@ -0,0 +1,142 @@
|
||||
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>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
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,5 +1,9 @@
|
||||
import { t } from "@lingui/core/macro";
|
||||
import { HiEllipsisHorizontal, HiOutlineTrash } from "react-icons/hi2";
|
||||
import {
|
||||
HiEllipsisHorizontal,
|
||||
HiOutlineCheckCircle,
|
||||
HiOutlineTrash,
|
||||
} from "react-icons/hi2";
|
||||
|
||||
import Dropdown from "~/components/Dropdown";
|
||||
import { useModal } from "~/providers/modal";
|
||||
@@ -10,6 +14,13 @@ export default function BoardDropdown() {
|
||||
return (
|
||||
<Dropdown
|
||||
items={[
|
||||
{
|
||||
label: t`Add checklist`,
|
||||
action: () => openModal("ADD_CHECKLIST"),
|
||||
icon: (
|
||||
<HiOutlineCheckCircle className="h-[16px] w-[16px] text-dark-900" />
|
||||
),
|
||||
},
|
||||
{
|
||||
label: t`Delete card`,
|
||||
action: () => openModal("DELETE_CARD"),
|
||||
|
||||
140
apps/web/src/views/card/components/NewChecklistForm.tsx
Normal file
140
apps/web/src/views/card/components/NewChecklistForm.tsx
Normal file
@@ -0,0 +1,140 @@
|
||||
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>
|
||||
);
|
||||
}
|
||||
167
apps/web/src/views/card/components/NewChecklistItemForm.tsx
Normal file
167
apps/web/src/views/card/components/NewChecklistItemForm.tsx
Normal file
@@ -0,0 +1,167 @@
|
||||
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,6 +1,7 @@
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
import { t } from "@lingui/core/macro";
|
||||
import { useEffect, useState } from "react";
|
||||
import { useForm } from "react-hook-form";
|
||||
import { IoChevronForwardSharp } from "react-icons/io5";
|
||||
|
||||
@@ -19,12 +20,16 @@ import { api } from "~/utils/api";
|
||||
import { formatMemberDisplayName, getAvatarUrl } from "~/utils/helpers";
|
||||
import { DeleteLabelConfirmation } from "../../components/DeleteLabelConfirmation";
|
||||
import ActivityList from "./components/ActivityList";
|
||||
import Checklists from "./components/Checklists";
|
||||
import { DeleteCardConfirmation } from "./components/DeleteCardConfirmation";
|
||||
import { DeleteChecklistConfirmation } from "./components/DeleteChecklistConfirmation";
|
||||
import { DeleteCommentConfirmation } from "./components/DeleteCommentConfirmation";
|
||||
import Dropdown from "./components/Dropdown";
|
||||
import LabelSelector from "./components/LabelSelector";
|
||||
import ListSelector from "./components/ListSelector";
|
||||
import MemberSelector from "./components/MemberSelector";
|
||||
import { NewChecklistForm } from "./components/NewChecklistForm";
|
||||
import NewChecklistItemForm from "./components/NewChecklistItemForm";
|
||||
import NewCommentForm from "./components/NewCommentForm";
|
||||
|
||||
interface FormValues {
|
||||
@@ -132,9 +137,18 @@ export function CardRightPanel() {
|
||||
export default function CardPage() {
|
||||
const router = useRouter();
|
||||
const utils = api.useUtils();
|
||||
const { modalContentType, entityId } = useModal();
|
||||
const {
|
||||
modalContentType,
|
||||
entityId,
|
||||
openModal,
|
||||
getModalState,
|
||||
clearModalState,
|
||||
} = useModal();
|
||||
const { showPopup } = usePopup();
|
||||
const { workspace } = useWorkspace();
|
||||
const [activeChecklistForm, setActiveChecklistForm] = useState<string | null>(
|
||||
null,
|
||||
);
|
||||
|
||||
const cardId = Array.isArray(router.query.cardId)
|
||||
? router.query.cardId[0]
|
||||
@@ -181,6 +195,17 @@ 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 <></>;
|
||||
|
||||
return (
|
||||
@@ -252,8 +277,14 @@ export default function CardPage() {
|
||||
</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">
|
||||
<h2 className="text-md pb-4 font-medium text-light-900 dark:text-dark-1000">
|
||||
<h2 className="text-md pb-4 font-medium text-light-1000 dark:text-dark-1000">
|
||||
{t`Activity`}
|
||||
</h2>
|
||||
<div>
|
||||
@@ -304,6 +335,15 @@ export default function CardPage() {
|
||||
/>
|
||||
)}
|
||||
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
|
||||
{modalContentType === "ADD_CHECKLIST" && (
|
||||
<NewChecklistForm cardPublicId={cardId} />
|
||||
)}
|
||||
{modalContentType === "DELETE_CHECKLIST" && (
|
||||
<DeleteChecklistConfirmation
|
||||
cardPublicId={cardId}
|
||||
checklistPublicId={entityId}
|
||||
/>
|
||||
)}
|
||||
</Modal>
|
||||
</div>
|
||||
</>
|
||||
|
||||
@@ -9,6 +9,7 @@ import LabelIcon from "~/components/LabelIcon";
|
||||
import { useModal } from "~/providers/modal";
|
||||
import { api } from "~/utils/api";
|
||||
import ActivityList from "~/views/card/components/ActivityList";
|
||||
import Checklists from "~/views/card/components/Checklists";
|
||||
|
||||
export function CardModal({
|
||||
cardPublicId,
|
||||
@@ -127,6 +128,13 @@ export function CardModal({
|
||||
</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`}
|
||||
|
||||
@@ -175,6 +175,7 @@ export default function PublicBoardView() {
|
||||
<Card
|
||||
title={card.title}
|
||||
labels={card.labels}
|
||||
checklists={card.checklists ?? []}
|
||||
members={[]}
|
||||
/>
|
||||
</Link>
|
||||
|
||||
Reference in New Issue
Block a user