Feat improve task details (#585)
* Fix project section * Add project and tags sections * Enhance task details page and add translations * Enhance Task Details page * Enhance project details page * Note details page fix * Enhance Views Tags Search * Search enhancements * fixup! Search enhancements
This commit is contained in:
parent
0213f79b0a
commit
8dc6194c80
53 changed files with 4793 additions and 1182 deletions
|
|
@ -17,6 +17,10 @@ function buildTaskAttributes(body, userId, timezone, isUpdate = false) {
|
|||
body.recurrence_weekday !== undefined
|
||||
? body.recurrence_weekday
|
||||
: null,
|
||||
recurrence_weekdays:
|
||||
body.recurrence_weekdays !== undefined
|
||||
? body.recurrence_weekdays
|
||||
: null,
|
||||
recurrence_month_day:
|
||||
body.recurrence_month_day !== undefined
|
||||
? body.recurrence_month_day
|
||||
|
|
@ -65,6 +69,10 @@ function buildUpdateAttributes(body, task, timezone) {
|
|||
body.recurrence_weekday !== undefined
|
||||
? body.recurrence_weekday
|
||||
: task.recurrence_weekday,
|
||||
recurrence_weekdays:
|
||||
body.recurrence_weekdays !== undefined
|
||||
? body.recurrence_weekdays
|
||||
: task.recurrence_weekdays,
|
||||
recurrence_month_day:
|
||||
body.recurrence_month_day !== undefined
|
||||
? body.recurrence_month_day
|
||||
|
|
|
|||
|
|
@ -445,6 +445,7 @@ router.patch('/task/:id', requireTaskWriteAccess, async (req, res) => {
|
|||
'recurrence_interval',
|
||||
'recurrence_end_date',
|
||||
'recurrence_weekday',
|
||||
'recurrence_weekdays',
|
||||
'recurrence_month_day',
|
||||
'recurrence_week_of_month',
|
||||
'completion_based',
|
||||
|
|
|
|||
|
|
@ -51,7 +51,18 @@ async function handleRecurrenceUpdate(task, recurrenceFields, reqBody) {
|
|||
|
||||
if (newRecurrenceType !== 'none') {
|
||||
for (const futureInstance of futureInstances) {
|
||||
await futureInstance.destroy();
|
||||
try {
|
||||
await futureInstance.destroy();
|
||||
} catch (error) {
|
||||
// If dependent records block deletion (e.g., subtasks FK), skip that instance
|
||||
console.warn(
|
||||
'Skipping recurring instance deletion due to constraint:',
|
||||
{
|
||||
id: futureInstance.id,
|
||||
error: error?.message,
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ const TASK_INCLUDES = [
|
|||
},
|
||||
{
|
||||
model: Project,
|
||||
attributes: ['id', 'name', 'uid'],
|
||||
attributes: ['id', 'name', 'uid', 'image_url'],
|
||||
required: false,
|
||||
},
|
||||
];
|
||||
|
|
|
|||
|
|
@ -147,9 +147,13 @@ test('user can mark a task as complete', async ({ page, baseURL }) => {
|
|||
await createTask(page, taskName);
|
||||
|
||||
// Enable "Show completed" first to ensure completed tasks remain visible
|
||||
const showCompletedButton = page.locator('button:has-text("Show completed")').first();
|
||||
if (await showCompletedButton.isVisible()) {
|
||||
await showCompletedButton.click();
|
||||
const sortFilterButton = page.getByRole('button', { name: /sort tasks/i });
|
||||
await expect(sortFilterButton).toBeVisible({ timeout: 5000 });
|
||||
await sortFilterButton.click();
|
||||
|
||||
const showCompletedToggle = page.getByRole('button', { name: /show completed/i });
|
||||
if (await showCompletedToggle.isVisible()) {
|
||||
await showCompletedToggle.click();
|
||||
await page.waitForLoadState('networkidle');
|
||||
}
|
||||
|
||||
|
|
@ -169,8 +173,8 @@ test('user can mark a task as complete', async ({ page, baseURL }) => {
|
|||
// Wait for network idle after completing the task
|
||||
await page.waitForLoadState('networkidle');
|
||||
|
||||
// Click the "Show completed" toggle to make completed tasks visible
|
||||
const showCompletedToggle = page.getByText('Show completed');
|
||||
// Click the "Show completed" toggle to make completed tasks visible (now inside the sort/filter dropdown)
|
||||
await sortFilterButton.click();
|
||||
await expect(showCompletedToggle).toBeVisible({ timeout: 5000 });
|
||||
await showCompletedToggle.click();
|
||||
await page.waitForLoadState('networkidle');
|
||||
|
|
@ -198,4 +202,4 @@ test('user can mark a task as complete', async ({ page, baseURL }) => {
|
|||
// task completion API worked (we saw status 200 and status: 2 in the response)
|
||||
const showCompletedState = await page.getByText('Show completed').textContent();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ import {
|
|||
} from './utils/projectsService';
|
||||
import { createTask, updateTask } from './utils/tasksService';
|
||||
import { isAuthError } from './utils/authUtils';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Link, useLocation } from 'react-router-dom';
|
||||
|
||||
interface LayoutProps {
|
||||
currentUser: User;
|
||||
|
|
@ -47,6 +47,8 @@ const Layout: React.FC<LayoutProps> = ({
|
|||
}) => {
|
||||
const { t } = useTranslation();
|
||||
const { showSuccessToast } = useToast();
|
||||
const location = useLocation();
|
||||
const isUpcomingView = location.pathname === '/upcoming';
|
||||
const [isSidebarOpen, setIsSidebarOpen] = useState(
|
||||
window.innerWidth >= 1024
|
||||
);
|
||||
|
|
@ -336,7 +338,11 @@ const Layout: React.FC<LayoutProps> = ({
|
|||
}
|
||||
};
|
||||
|
||||
const mainContentMarginLeft = isSidebarOpen ? 'ml-72' : 'ml-0';
|
||||
const mainContentMarginLeft = isUpcomingView
|
||||
? 'ml-0'
|
||||
: isSidebarOpen
|
||||
? 'ml-72'
|
||||
: 'ml-0';
|
||||
|
||||
const isLoading =
|
||||
isNotesLoading ||
|
||||
|
|
@ -460,9 +466,9 @@ const Layout: React.FC<LayoutProps> = ({
|
|||
>
|
||||
<div className="flex flex-col bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100 min-h-screen overflow-y-auto">
|
||||
<div
|
||||
className={`flex-grow py-0 px-0 md:px-4 transition-all duration-300 ${
|
||||
className={`flex-grow py-0 px-0 transition-all duration-300 ${
|
||||
isMobileSearchOpen ? 'pt-32' : 'pt-20'
|
||||
} md:pt-20`}
|
||||
} md:pt-20 ${isUpcomingView ? '' : 'md:px-4'}`}
|
||||
>
|
||||
<div className="w-full">{children}</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -526,11 +526,11 @@ const Notes: React.FC = () => {
|
|||
onClick={() => handleSelectNote(note)}
|
||||
className={`p-5 cursor-pointer ${
|
||||
previewNote?.uid === note.uid
|
||||
? 'bg-white dark:bg-gray-900 border-b border-transparent'
|
||||
? 'bg-white dark:bg-gray-900 border-b border-transparent mr-4 rounded-lg'
|
||||
: index !==
|
||||
sortedNotes.length - 1
|
||||
? 'border-b border-gray-200/50 dark:border-gray-700/50 hover:bg-gray-50 dark:hover:bg-gray-800'
|
||||
: 'border-b border-transparent hover:bg-gray-50 dark:hover:bg-gray-800'
|
||||
? 'border-b border-gray-200/30 dark:border-gray-700/30 hover:bg-gray-50 dark:hover:bg-gray-800 mr-4'
|
||||
: 'border-b border-transparent hover:bg-gray-50 dark:hover:bg-gray-800 mr-4'
|
||||
}`}
|
||||
>
|
||||
<h3 className="text-sm font-semibold text-gray-900 dark:text-gray-100 truncate">
|
||||
|
|
|
|||
|
|
@ -854,10 +854,11 @@ const ProjectDetails: React.FC = () => {
|
|||
}
|
||||
|
||||
return (
|
||||
<div className="flex justify-center px-4 lg:px-2">
|
||||
<div className="w-full max-w-5xl">
|
||||
<div className="w-full">
|
||||
{/* Project Banner - Full Width */}
|
||||
<div className="w-full">
|
||||
{/* Project Banner - Unified for both with and without images */}
|
||||
<div className="mb-6 rounded-lg overflow-hidden relative group">
|
||||
<div className="mb-6 overflow-hidden relative group">
|
||||
{/* Background - Image or Gradient */}
|
||||
{project.image_url ? (
|
||||
<img
|
||||
|
|
@ -1021,79 +1022,175 @@ const ProjectDetails: React.FC = () => {
|
|||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Header with Tab Links and Controls */}
|
||||
<div className="mb-4">
|
||||
{/* Mobile Layout */}
|
||||
<div className="sm:hidden">
|
||||
<div className="flex items-center justify-between mb-3">
|
||||
{/* Content Container - Centered with max width */}
|
||||
<div className="flex justify-center px-4 lg:px-2">
|
||||
<div className="w-full max-w-5xl">
|
||||
{/* Header with Tab Links and Controls */}
|
||||
<div className="mb-4">
|
||||
{/* Mobile Layout */}
|
||||
<div className="sm:hidden">
|
||||
<div className="flex items-center justify-between mb-3">
|
||||
{/* Tab Navigation Links */}
|
||||
<div className="flex items-center space-x-6">
|
||||
<button
|
||||
onClick={() => setActiveTab('tasks')}
|
||||
className={`flex items-center py-2 text-sm font-medium transition-colors ${
|
||||
activeTab === 'tasks'
|
||||
? 'text-gray-900 dark:text-gray-100'
|
||||
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200'
|
||||
}`}
|
||||
>
|
||||
<span>
|
||||
{t('sidebar.tasks', 'Tasks')}
|
||||
</span>
|
||||
<span
|
||||
className={`ml-2 px-2 py-0.5 text-xs rounded-full ${
|
||||
displayTasks.length > 0
|
||||
? 'bg-gray-200 dark:bg-gray-600'
|
||||
: 'bg-transparent'
|
||||
}`}
|
||||
style={{
|
||||
minWidth: '20px',
|
||||
visibility:
|
||||
displayTasks.length > 0
|
||||
? 'visible'
|
||||
: 'hidden',
|
||||
}}
|
||||
>
|
||||
{displayTasks.length > 0
|
||||
? displayTasks.length
|
||||
: '0'}
|
||||
</span>
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setActiveTab('notes')}
|
||||
className={`flex items-center py-2 text-sm font-medium transition-colors ${
|
||||
activeTab === 'notes'
|
||||
? 'text-gray-900 dark:text-gray-100'
|
||||
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200'
|
||||
}`}
|
||||
>
|
||||
<span>
|
||||
{t('sidebar.notes', 'Notes')}
|
||||
</span>
|
||||
<span
|
||||
className={`ml-2 px-2 py-0.5 text-xs rounded-full ${
|
||||
notes.length > 0
|
||||
? 'bg-gray-200 dark:bg-gray-600'
|
||||
: 'bg-transparent'
|
||||
}`}
|
||||
style={{
|
||||
minWidth: '20px',
|
||||
visibility:
|
||||
notes.length > 0
|
||||
? 'visible'
|
||||
: 'hidden',
|
||||
}}
|
||||
>
|
||||
{notes.length > 0
|
||||
? notes.length
|
||||
: '0'}
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Inline Controls - Always visible for tasks tab */}
|
||||
{activeTab === 'tasks' && (
|
||||
<div className="flex items-center gap-2 flex-wrap justify-end">
|
||||
{/* Search Button */}
|
||||
<button
|
||||
onClick={() =>
|
||||
setIsSearchExpanded((v) => !v)
|
||||
}
|
||||
className={`flex items-center transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-inset rounded-lg p-1.5 ${
|
||||
isSearchExpanded
|
||||
? 'bg-blue-50/70 dark:bg-blue-900/20'
|
||||
: 'bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700'
|
||||
}`}
|
||||
aria-expanded={isSearchExpanded}
|
||||
aria-label={
|
||||
isSearchExpanded
|
||||
? 'Collapse search panel'
|
||||
: 'Show search input'
|
||||
}
|
||||
title={
|
||||
isSearchExpanded
|
||||
? 'Hide search'
|
||||
: 'Search Tasks'
|
||||
}
|
||||
>
|
||||
<MagnifyingGlassIcon className="h-4 w-4 text-gray-600 dark:text-gray-200" />
|
||||
</button>
|
||||
<IconSortDropdown
|
||||
options={sortOptions}
|
||||
value={orderBy}
|
||||
onChange={handleSortChange}
|
||||
ariaLabel={t(
|
||||
'projects.sortTasks',
|
||||
'Sort tasks'
|
||||
)}
|
||||
title={t(
|
||||
'projects.sortTasks',
|
||||
'Sort tasks'
|
||||
)}
|
||||
dropdownLabel={t(
|
||||
'tasks.sortBy',
|
||||
'Sort by'
|
||||
)}
|
||||
extraContent={renderShowCompletedToggle()}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Desktop Layout */}
|
||||
<div className="hidden sm:flex items-center justify-between min-h-[2.5rem]">
|
||||
{/* Tab Navigation Links */}
|
||||
<div className="flex items-center space-x-6">
|
||||
<button
|
||||
onClick={() => setActiveTab('tasks')}
|
||||
className={`flex items-center py-2 text-sm font-medium transition-colors ${
|
||||
className={`flex items-center space-x-2 text-sm font-medium transition-colors ${
|
||||
activeTab === 'tasks'
|
||||
? 'text-gray-900 dark:text-gray-100'
|
||||
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200'
|
||||
}`}
|
||||
>
|
||||
<span>{t('sidebar.tasks', 'Tasks')}</span>
|
||||
<span
|
||||
className={`ml-2 px-2 py-0.5 text-xs rounded-full ${
|
||||
displayTasks.length > 0
|
||||
? 'bg-gray-200 dark:bg-gray-600'
|
||||
: 'bg-transparent'
|
||||
}`}
|
||||
style={{
|
||||
minWidth: '20px',
|
||||
visibility:
|
||||
displayTasks.length > 0
|
||||
? 'visible'
|
||||
: 'hidden',
|
||||
}}
|
||||
>
|
||||
{displayTasks.length > 0
|
||||
? displayTasks.length
|
||||
: '0'}
|
||||
</span>
|
||||
{displayTasks.length > 0 && (
|
||||
<span className="ml-2 px-2 py-0.5 text-xs bg-gray-200 dark:bg-gray-600 rounded-full">
|
||||
{displayTasks.length}
|
||||
</span>
|
||||
)}
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setActiveTab('notes')}
|
||||
className={`flex items-center py-2 text-sm font-medium transition-colors ${
|
||||
className={`flex items-center space-x-2 text-sm font-medium transition-colors ${
|
||||
activeTab === 'notes'
|
||||
? 'text-gray-900 dark:text-gray-100'
|
||||
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200'
|
||||
}`}
|
||||
>
|
||||
<span>{t('sidebar.notes', 'Notes')}</span>
|
||||
<span
|
||||
className={`ml-2 px-2 py-0.5 text-xs rounded-full ${
|
||||
notes.length > 0
|
||||
? 'bg-gray-200 dark:bg-gray-600'
|
||||
: 'bg-transparent'
|
||||
}`}
|
||||
style={{
|
||||
minWidth: '20px',
|
||||
visibility:
|
||||
notes.length > 0
|
||||
? 'visible'
|
||||
: 'hidden',
|
||||
}}
|
||||
>
|
||||
{notes.length > 0 ? notes.length : '0'}
|
||||
</span>
|
||||
{notes.length > 0 && (
|
||||
<span className="ml-2 px-2 py-0.5 text-xs bg-gray-200 dark:bg-gray-600 rounded-full">
|
||||
{notes.length}
|
||||
</span>
|
||||
)}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Inline Controls - Always visible for tasks tab */}
|
||||
{activeTab === 'tasks' && (
|
||||
<div className="flex items-center gap-2 flex-wrap justify-end">
|
||||
<div className="flex items-center gap-4">
|
||||
{/* Search Button */}
|
||||
<button
|
||||
onClick={() =>
|
||||
setIsSearchExpanded((v) => !v)
|
||||
}
|
||||
className={`flex items-center transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-inset rounded-lg p-1.5 ${
|
||||
className={`flex items-center transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-inset rounded-lg p-2 ${
|
||||
isSearchExpanded
|
||||
? 'bg-blue-50/70 dark:bg-blue-900/20'
|
||||
: 'bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700'
|
||||
|
|
@ -1110,7 +1207,7 @@ const ProjectDetails: React.FC = () => {
|
|||
: 'Search Tasks'
|
||||
}
|
||||
>
|
||||
<MagnifyingGlassIcon className="h-4 w-4 text-gray-600 dark:text-gray-200" />
|
||||
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-200" />
|
||||
</button>
|
||||
<IconSortDropdown
|
||||
options={sortOptions}
|
||||
|
|
@ -1135,298 +1232,217 @@ const ProjectDetails: React.FC = () => {
|
|||
</div>
|
||||
</div>
|
||||
|
||||
{/* Desktop Layout */}
|
||||
<div className="hidden sm:flex items-center justify-between min-h-[2.5rem]">
|
||||
{/* Tab Navigation Links */}
|
||||
<div className="flex items-center space-x-6">
|
||||
<button
|
||||
onClick={() => setActiveTab('tasks')}
|
||||
className={`flex items-center space-x-2 text-sm font-medium transition-colors ${
|
||||
activeTab === 'tasks'
|
||||
? 'text-gray-900 dark:text-gray-100'
|
||||
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200'
|
||||
}`}
|
||||
>
|
||||
<span>{t('sidebar.tasks', 'Tasks')}</span>
|
||||
{displayTasks.length > 0 && (
|
||||
<span className="ml-2 px-2 py-0.5 text-xs bg-gray-200 dark:bg-gray-600 rounded-full">
|
||||
{displayTasks.length}
|
||||
</span>
|
||||
)}
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setActiveTab('notes')}
|
||||
className={`flex items-center space-x-2 text-sm font-medium transition-colors ${
|
||||
activeTab === 'notes'
|
||||
? 'text-gray-900 dark:text-gray-100'
|
||||
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200'
|
||||
}`}
|
||||
>
|
||||
<span>{t('sidebar.notes', 'Notes')}</span>
|
||||
{notes.length > 0 && (
|
||||
<span className="ml-2 px-2 py-0.5 text-xs bg-gray-200 dark:bg-gray-600 rounded-full">
|
||||
{notes.length}
|
||||
</span>
|
||||
)}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Inline Controls - Always visible for tasks tab */}
|
||||
{activeTab === 'tasks' && (
|
||||
<div className="flex items-center gap-4">
|
||||
{/* Search Button */}
|
||||
<button
|
||||
onClick={() =>
|
||||
setIsSearchExpanded((v) => !v)
|
||||
}
|
||||
className={`flex items-center transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-inset rounded-lg p-2 ${
|
||||
isSearchExpanded
|
||||
? 'bg-blue-50/70 dark:bg-blue-900/20'
|
||||
: 'bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700'
|
||||
}`}
|
||||
aria-expanded={isSearchExpanded}
|
||||
aria-label={
|
||||
isSearchExpanded
|
||||
? 'Collapse search panel'
|
||||
: 'Show search input'
|
||||
}
|
||||
title={
|
||||
isSearchExpanded
|
||||
? 'Hide search'
|
||||
: 'Search Tasks'
|
||||
}
|
||||
>
|
||||
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-200" />
|
||||
</button>
|
||||
<IconSortDropdown
|
||||
options={sortOptions}
|
||||
value={orderBy}
|
||||
onChange={handleSortChange}
|
||||
ariaLabel={t(
|
||||
'projects.sortTasks',
|
||||
'Sort tasks'
|
||||
{/* Search input section, collapsible - only for tasks tab */}
|
||||
{activeTab === 'tasks' && (
|
||||
<div
|
||||
className={`transition-all duration-300 ease-in-out ${
|
||||
isSearchExpanded
|
||||
? 'max-h-24 opacity-100 mb-4'
|
||||
: 'max-h-0 opacity-0 mb-0'
|
||||
} overflow-hidden`}
|
||||
>
|
||||
<div className="flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-4 py-3">
|
||||
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-400 mr-2" />
|
||||
<input
|
||||
type="text"
|
||||
placeholder={t(
|
||||
'tasks.searchPlaceholder',
|
||||
'Search tasks...'
|
||||
)}
|
||||
title={t(
|
||||
'projects.sortTasks',
|
||||
'Sort tasks'
|
||||
)}
|
||||
dropdownLabel={t('tasks.sortBy', 'Sort by')}
|
||||
extraContent={renderShowCompletedToggle()}
|
||||
value={taskSearchQuery}
|
||||
onChange={(e) =>
|
||||
setTaskSearchQuery(e.target.value)
|
||||
}
|
||||
className="w-full bg-transparent border-none focus:ring-0 focus:outline-none dark:text-white"
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Search input section, collapsible - only for tasks tab */}
|
||||
{activeTab === 'tasks' && (
|
||||
<div
|
||||
className={`transition-all duration-300 ease-in-out ${
|
||||
isSearchExpanded
|
||||
? 'max-h-24 opacity-100 mb-4'
|
||||
: 'max-h-0 opacity-0 mb-0'
|
||||
} overflow-hidden`}
|
||||
>
|
||||
<div className="flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-4 py-3">
|
||||
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-400 mr-2" />
|
||||
<input
|
||||
type="text"
|
||||
placeholder={t(
|
||||
'tasks.searchPlaceholder',
|
||||
'Search tasks...'
|
||||
)}
|
||||
value={taskSearchQuery}
|
||||
onChange={(e) =>
|
||||
setTaskSearchQuery(e.target.value)
|
||||
}
|
||||
className="w-full bg-transparent border-none focus:ring-0 focus:outline-none dark:text-white"
|
||||
{/* Auto-suggest form for tasks with no items */}
|
||||
{activeTab === 'tasks' && showAutoSuggestForm && (
|
||||
<div className="transition-all duration-300 ease-in-out opacity-100 transform translate-y-0 mb-6">
|
||||
<AutoSuggestNextActionBox
|
||||
onAddAction={(actionDescription) => {
|
||||
if (project?.id) {
|
||||
handleCreateNextAction(
|
||||
project.id,
|
||||
actionDescription
|
||||
);
|
||||
}
|
||||
}}
|
||||
onDismiss={handleSkipNextAction}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
)}
|
||||
|
||||
{/* Auto-suggest form for tasks with no items */}
|
||||
{activeTab === 'tasks' && showAutoSuggestForm && (
|
||||
<div className="transition-all duration-300 ease-in-out opacity-100 transform translate-y-0 mb-6">
|
||||
<AutoSuggestNextActionBox
|
||||
onAddAction={(actionDescription) => {
|
||||
if (project?.id) {
|
||||
handleCreateNextAction(
|
||||
project.id,
|
||||
actionDescription
|
||||
);
|
||||
}
|
||||
}}
|
||||
onDismiss={handleSkipNextAction}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
{/* Tasks Tab Content */}
|
||||
{activeTab === 'tasks' && (
|
||||
<>
|
||||
<div
|
||||
className={`transition-all duration-300 ease-in-out overflow-hidden mb-1.5 ${
|
||||
!showAutoSuggestForm
|
||||
? 'opacity-100 max-h-96 transform translate-y-0'
|
||||
: 'opacity-0 max-h-0 transform -translate-y-2'
|
||||
}`}
|
||||
>
|
||||
<NewTask onTaskCreate={handleTaskCreate} />
|
||||
</div>
|
||||
|
||||
{/* Tasks Tab Content */}
|
||||
{activeTab === 'tasks' && (
|
||||
<>
|
||||
<div
|
||||
className={`transition-all duration-300 ease-in-out overflow-hidden mb-1.5 ${
|
||||
!showAutoSuggestForm
|
||||
? 'opacity-100 max-h-96 transform translate-y-0'
|
||||
: 'opacity-0 max-h-0 transform -translate-y-2'
|
||||
}`}
|
||||
>
|
||||
<NewTask onTaskCreate={handleTaskCreate} />
|
||||
</div>
|
||||
<div className="transition-all duration-300 ease-in-out overflow-visible">
|
||||
{displayTasks.length > 0 ? (
|
||||
<div className="transition-all duration-300 ease-in-out opacity-100 transform translate-y-0 overflow-visible">
|
||||
<TaskList
|
||||
tasks={displayTasks}
|
||||
onTaskUpdate={handleTaskUpdate}
|
||||
onTaskDelete={handleTaskDelete}
|
||||
projects={allProjects}
|
||||
hideProjectName={true}
|
||||
onToggleToday={handleToggleToday}
|
||||
showCompletedTasks={showCompleted}
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<div className="transition-all duration-300 ease-in-out opacity-100 transform translate-y-0">
|
||||
<p className="text-gray-500 dark:text-gray-400">
|
||||
{taskSearchQuery.trim()
|
||||
? t(
|
||||
'tasks.noTasksAvailable',
|
||||
'No tasks available.'
|
||||
)
|
||||
: showCompleted
|
||||
? t(
|
||||
'project.noCompletedTasks',
|
||||
'No completed tasks.'
|
||||
)
|
||||
: t(
|
||||
'project.noTasks',
|
||||
'No tasks.'
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
|
||||
<div className="transition-all duration-300 ease-in-out overflow-visible">
|
||||
{displayTasks.length > 0 ? (
|
||||
<div className="transition-all duration-300 ease-in-out opacity-100 transform translate-y-0 overflow-visible">
|
||||
<TaskList
|
||||
tasks={displayTasks}
|
||||
onTaskUpdate={handleTaskUpdate}
|
||||
onTaskDelete={handleTaskDelete}
|
||||
projects={allProjects}
|
||||
hideProjectName={true}
|
||||
onToggleToday={handleToggleToday}
|
||||
showCompletedTasks={showCompleted}
|
||||
/>
|
||||
{/* Notes Content */}
|
||||
{activeTab === 'notes' && (
|
||||
<div className="transition-all duration-300 ease-in-out">
|
||||
{/* Create New Note Button - Always visible */}
|
||||
<div className="mb-4">
|
||||
<button
|
||||
type="button"
|
||||
className="inline-flex items-center gap-2 px-3 py-1.5 text-sm rounded-md bg-gray-200 text-gray-800 hover:bg-gray-300 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 transition-colors"
|
||||
onClick={() => {
|
||||
if (!project?.id || !project.name)
|
||||
return;
|
||||
setSelectedNote({
|
||||
title: '',
|
||||
content: '',
|
||||
tags: [],
|
||||
project_id: project.id,
|
||||
project: {
|
||||
id: project.id,
|
||||
name: project.name,
|
||||
uid: project.uid,
|
||||
},
|
||||
project_uid: project.uid,
|
||||
});
|
||||
setIsNoteModalOpen(true);
|
||||
}}
|
||||
>
|
||||
<PlusCircleIcon className="h-5 w-5" />
|
||||
{t('noteCreation', 'Create New Note')}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Notes Grid or Empty State */}
|
||||
{notes.length > 0 ? (
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||
{notes.map((note) => (
|
||||
<NoteCard
|
||||
key={note.uid}
|
||||
note={note}
|
||||
onEdit={handleEditNote}
|
||||
onDelete={(note) => {
|
||||
setNoteToDelete(note);
|
||||
setIsConfirmDialogOpen(true);
|
||||
}}
|
||||
showActions={true}
|
||||
showProject={false}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<div className="transition-all duration-300 ease-in-out opacity-100 transform translate-y-0">
|
||||
<p className="text-gray-500 dark:text-gray-400">
|
||||
{taskSearchQuery.trim()
|
||||
? t(
|
||||
'tasks.noTasksAvailable',
|
||||
'No tasks available.'
|
||||
)
|
||||
: showCompleted
|
||||
? t(
|
||||
'project.noCompletedTasks',
|
||||
'No completed tasks.'
|
||||
)
|
||||
: t(
|
||||
'project.noTasks',
|
||||
'No tasks.'
|
||||
)}
|
||||
<div className="text-gray-500 dark:text-gray-400">
|
||||
<p>
|
||||
{t(
|
||||
'project.noNotes',
|
||||
'No notes for this project.'
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
)}
|
||||
|
||||
{/* Notes Content */}
|
||||
{activeTab === 'notes' && (
|
||||
<div className="transition-all duration-300 ease-in-out">
|
||||
{/* Create New Note Button - Always visible */}
|
||||
<div className="mb-4">
|
||||
<button
|
||||
type="button"
|
||||
className="inline-flex items-center gap-2 px-3 py-1.5 text-sm rounded-md bg-gray-200 text-gray-800 hover:bg-gray-300 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 transition-colors"
|
||||
onClick={() => {
|
||||
if (!project?.id || !project.name) return;
|
||||
setSelectedNote({
|
||||
title: '',
|
||||
content: '',
|
||||
tags: [],
|
||||
project_id: project.id,
|
||||
project: {
|
||||
id: project.id,
|
||||
name: project.name,
|
||||
uid: project.uid,
|
||||
},
|
||||
project_uid: project.uid,
|
||||
});
|
||||
setIsNoteModalOpen(true);
|
||||
}}
|
||||
>
|
||||
<PlusCircleIcon className="h-5 w-5" />
|
||||
{t('noteCreation', 'Create New Note')}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Notes Grid or Empty State */}
|
||||
{notes.length > 0 ? (
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||
{notes.map((note) => (
|
||||
<NoteCard
|
||||
key={note.uid}
|
||||
note={note}
|
||||
onEdit={handleEditNote}
|
||||
onDelete={(note) => {
|
||||
setNoteToDelete(note);
|
||||
setIsConfirmDialogOpen(true);
|
||||
}}
|
||||
showActions={true}
|
||||
showProject={false}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<div className="text-gray-500 dark:text-gray-400">
|
||||
<p>
|
||||
{t(
|
||||
'project.noNotes',
|
||||
'No notes for this project.'
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
<ProjectModal
|
||||
isOpen={isModalOpen}
|
||||
onClose={closeModal}
|
||||
onSave={handleSaveProject}
|
||||
project={project}
|
||||
areas={areas}
|
||||
/>
|
||||
|
||||
{/* NoteModal */}
|
||||
<NoteModal
|
||||
isOpen={isNoteModalOpen}
|
||||
onClose={() => {
|
||||
setIsNoteModalOpen(false);
|
||||
setSelectedNote(null);
|
||||
}}
|
||||
onSave={handleSaveNote}
|
||||
note={selectedNote}
|
||||
projects={allProjects}
|
||||
/>
|
||||
|
||||
{isConfirmDialogOpen && noteToDelete && (
|
||||
<ConfirmDialog
|
||||
title="Delete Note"
|
||||
message={`Are you sure you want to delete the note "${noteToDelete.title}"?`}
|
||||
onConfirm={() => {
|
||||
const identifier =
|
||||
noteToDelete?.uid ??
|
||||
(noteToDelete?.id !== undefined
|
||||
? String(noteToDelete.id)
|
||||
: null);
|
||||
|
||||
if (identifier) {
|
||||
handleDeleteNote(identifier);
|
||||
}
|
||||
}}
|
||||
onCancel={() => {
|
||||
setIsConfirmDialogOpen(false);
|
||||
setNoteToDelete(null);
|
||||
}}
|
||||
<ProjectModal
|
||||
isOpen={isModalOpen}
|
||||
onClose={closeModal}
|
||||
onSave={handleSaveProject}
|
||||
project={project}
|
||||
areas={areas}
|
||||
/>
|
||||
)}
|
||||
{isConfirmDialogOpen && !noteToDelete && (
|
||||
<ConfirmDialog
|
||||
title={t(
|
||||
'modals.deleteProject.title',
|
||||
'Delete Project'
|
||||
)}
|
||||
message={t(
|
||||
'modals.deleteProject.message',
|
||||
'Deleting this project will remove the project only. All items inside will be retained but will no longer belong to any project. Continue?'
|
||||
)}
|
||||
onConfirm={handleDeleteProject}
|
||||
onCancel={() => setIsConfirmDialogOpen(false)}
|
||||
|
||||
{/* NoteModal */}
|
||||
<NoteModal
|
||||
isOpen={isNoteModalOpen}
|
||||
onClose={() => {
|
||||
setIsNoteModalOpen(false);
|
||||
setSelectedNote(null);
|
||||
}}
|
||||
onSave={handleSaveNote}
|
||||
note={selectedNote}
|
||||
projects={allProjects}
|
||||
/>
|
||||
)}
|
||||
|
||||
{isConfirmDialogOpen && noteToDelete && (
|
||||
<ConfirmDialog
|
||||
title="Delete Note"
|
||||
message={`Are you sure you want to delete the note "${noteToDelete.title}"?`}
|
||||
onConfirm={() => {
|
||||
const identifier =
|
||||
noteToDelete?.uid ??
|
||||
(noteToDelete?.id !== undefined
|
||||
? String(noteToDelete.id)
|
||||
: null);
|
||||
|
||||
if (identifier) {
|
||||
handleDeleteNote(identifier);
|
||||
}
|
||||
}}
|
||||
onCancel={() => {
|
||||
setIsConfirmDialogOpen(false);
|
||||
setNoteToDelete(null);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
{isConfirmDialogOpen && !noteToDelete && (
|
||||
<ConfirmDialog
|
||||
title={t(
|
||||
'modals.deleteProject.title',
|
||||
'Delete Project'
|
||||
)}
|
||||
message={t(
|
||||
'modals.deleteProject.message',
|
||||
'Deleting this project will remove the project only. All items inside will be retained but will no longer belong to any project. Continue?'
|
||||
)}
|
||||
onConfirm={handleDeleteProject}
|
||||
onCancel={() => setIsConfirmDialogOpen(false)}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -271,10 +271,10 @@ const DatePicker: React.FC<DatePickerProps> = ({
|
|||
<div className="relative">
|
||||
<button
|
||||
type="button"
|
||||
className={`inline-flex justify-between w-full px-3 py-2 bg-white dark:bg-gray-900 text-sm text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-900 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ${
|
||||
className={`inline-flex justify-between w-full px-3 py-2 bg-white dark:bg-gray-800 text-sm text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ${
|
||||
disabled
|
||||
? 'opacity-50 cursor-not-allowed'
|
||||
: 'hover:bg-gray-50 dark:hover:bg-gray-800'
|
||||
: 'hover:bg-gray-50 dark:hover:bg-gray-700'
|
||||
}`}
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
|
|
|
|||
|
|
@ -101,10 +101,10 @@ const NumberSelectDropdown: React.FC<NumberSelectDropdownProps> = ({
|
|||
>
|
||||
<button
|
||||
type="button"
|
||||
className={`inline-flex justify-between w-full px-3 py-2 bg-white dark:bg-gray-900 text-sm text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-900 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ${
|
||||
className={`inline-flex justify-between w-full px-3 py-2 bg-white dark:bg-gray-800 text-sm text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ${
|
||||
disabled
|
||||
? 'opacity-50 cursor-not-allowed'
|
||||
: 'hover:bg-gray-50 dark:hover:bg-gray-800'
|
||||
: 'hover:bg-gray-50 dark:hover:bg-gray-700'
|
||||
}`}
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
|
|
|
|||
|
|
@ -98,10 +98,10 @@ const RecurrenceSelectDropdown: React.FC<RecurrenceSelectDropdownProps> = ({
|
|||
>
|
||||
<button
|
||||
type="button"
|
||||
className={`inline-flex justify-between w-full px-3 py-2 bg-white dark:bg-gray-900 text-sm text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-900 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ${
|
||||
className={`inline-flex justify-between w-full px-3 py-2 bg-white dark:bg-gray-800 text-sm text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ${
|
||||
disabled
|
||||
? 'opacity-50 cursor-not-allowed'
|
||||
: 'hover:bg-gray-50 dark:hover:bg-gray-800'
|
||||
: 'hover:bg-gray-50 dark:hover:bg-gray-700'
|
||||
}`}
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
|
|
|
|||
|
|
@ -24,7 +24,8 @@ import { Tag } from '../../entities/Tag';
|
|||
import { useStore } from '../../store/useStore';
|
||||
import { updateTag, deleteTag } from '../../utils/tagsService';
|
||||
import { getApiPath } from '../../config/paths';
|
||||
import SortFilterButton, { SortOption } from '../Shared/SortFilterButton';
|
||||
import { SortOption } from '../Shared/SortFilterButton';
|
||||
import IconSortDropdown from '../Shared/IconSortDropdown';
|
||||
|
||||
const TagDetails: React.FC = () => {
|
||||
const { t } = useTranslation();
|
||||
|
|
@ -374,50 +375,28 @@ const TagDetails: React.FC = () => {
|
|||
aria-expanded={isSearchExpanded}
|
||||
aria-label={
|
||||
isSearchExpanded
|
||||
? 'Collapse search panel'
|
||||
: 'Show search input'
|
||||
? t(
|
||||
'common.hideSearch',
|
||||
'Collapse search panel'
|
||||
)
|
||||
: t(
|
||||
'common.showSearch',
|
||||
'Show search input'
|
||||
)
|
||||
}
|
||||
title={
|
||||
isSearchExpanded
|
||||
? 'Hide search'
|
||||
: 'Search Tasks'
|
||||
? t('common.hideSearch', 'Hide search')
|
||||
: t('common.search', 'Search tasks')
|
||||
}
|
||||
>
|
||||
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-200" />
|
||||
</button>
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="text-sm text-gray-600 dark:text-gray-400">
|
||||
Show completed
|
||||
<span className="sr-only">
|
||||
{isSearchExpanded
|
||||
? t('common.hideSearch', 'Hide search')
|
||||
: t('common.search', 'Search tasks')}
|
||||
</span>
|
||||
<button
|
||||
onClick={() => setShowCompleted((v) => !v)}
|
||||
className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${
|
||||
showCompleted
|
||||
? 'bg-blue-600'
|
||||
: 'bg-gray-200 dark:bg-gray-600'
|
||||
}`}
|
||||
aria-pressed={showCompleted}
|
||||
aria-label={
|
||||
showCompleted
|
||||
? 'Hide completed tasks'
|
||||
: 'Show completed tasks'
|
||||
}
|
||||
>
|
||||
<span
|
||||
className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
|
||||
showCompleted
|
||||
? 'translate-x-4'
|
||||
: 'translate-x-0.5'
|
||||
}`}
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
<SortFilterButton
|
||||
options={sortOptions}
|
||||
value={orderBy}
|
||||
onChange={setOrderBy}
|
||||
size="desktop"
|
||||
/>
|
||||
</button>
|
||||
<button
|
||||
ref={editButtonRef}
|
||||
type="button"
|
||||
|
|
@ -505,12 +484,74 @@ const TagDetails: React.FC = () => {
|
|||
</div>
|
||||
|
||||
{/* Tasks Section */}
|
||||
{displayTasks.length > 0 && (
|
||||
<div className="mb-8">
|
||||
<h3 className="text-lg font-semibold text-gray-900 dark:text-white mb-4 flex items-center">
|
||||
<div className="mb-8">
|
||||
<div className="flex items-center justify-between mb-4">
|
||||
<h3 className="text-lg font-semibold text-gray-900 dark:text-white flex items-center">
|
||||
<CheckIcon className="h-5 w-5 mr-2" />
|
||||
{t('tasks.title')} ({displayTasks.length})
|
||||
</h3>
|
||||
<IconSortDropdown
|
||||
options={sortOptions}
|
||||
value={orderBy}
|
||||
onChange={setOrderBy}
|
||||
ariaLabel={t('tasks.sortTasks', 'Sort tasks')}
|
||||
title={t('tasks.sortTasks', 'Sort tasks')}
|
||||
dropdownLabel={t('tasks.sortBy', 'Sort by')}
|
||||
extraContent={
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setShowCompleted((v) => !v)}
|
||||
className="w-full flex items-center justify-between text-sm text-gray-700 dark:text-gray-300"
|
||||
aria-pressed={showCompleted}
|
||||
aria-label={
|
||||
showCompleted
|
||||
? t(
|
||||
'tasks.hideCompleted',
|
||||
'Hide completed tasks'
|
||||
)
|
||||
: t(
|
||||
'tasks.showCompleted',
|
||||
'Show completed tasks'
|
||||
)
|
||||
}
|
||||
title={
|
||||
showCompleted
|
||||
? t(
|
||||
'tasks.hideCompleted',
|
||||
'Hide completed tasks'
|
||||
)
|
||||
: t(
|
||||
'tasks.showCompleted',
|
||||
'Show completed tasks'
|
||||
)
|
||||
}
|
||||
>
|
||||
<span>
|
||||
{t(
|
||||
'tasks.showCompleted',
|
||||
'Show completed'
|
||||
)}
|
||||
</span>
|
||||
<span
|
||||
className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${
|
||||
showCompleted
|
||||
? 'bg-blue-600'
|
||||
: 'bg-gray-200 dark:bg-gray-600'
|
||||
}`}
|
||||
>
|
||||
<span
|
||||
className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
|
||||
showCompleted
|
||||
? 'translate-x-4'
|
||||
: 'translate-x-0.5'
|
||||
}`}
|
||||
/>
|
||||
</span>
|
||||
</button>
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
{displayTasks.length > 0 ? (
|
||||
<TaskList
|
||||
tasks={displayTasks}
|
||||
onTaskUpdate={handleTaskUpdate}
|
||||
|
|
@ -520,8 +561,12 @@ const TagDetails: React.FC = () => {
|
|||
onToggleToday={handleToggleToday}
|
||||
showCompletedTasks={showCompleted}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
) : (
|
||||
<p className="text-sm text-gray-500 dark:text-gray-400">
|
||||
{t('tasks.noTasksAvailable', 'No tasks available.')}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Notes Section */}
|
||||
{notes.length > 0 && (
|
||||
|
|
|
|||
|
|
@ -199,13 +199,15 @@ const TagInput: React.FC<TagInputProps> = ({
|
|||
<div className="space-y-2 relative">
|
||||
<div
|
||||
ref={containerRef}
|
||||
className="flex flex-wrap items-center border border-gray-300 dark:border-gray-900 bg-white dark:bg-gray-900 rounded-md p-2 min-h-[40px]"
|
||||
className={`flex flex-wrap items-start gap-2 border border-gray-300 dark:border-gray-900 bg-white dark:bg-gray-900 rounded-md px-2 min-h-[40px] ${
|
||||
tags.length > 3 ? 'py-3' : 'py-2'
|
||||
}`}
|
||||
>
|
||||
{tags.length > 0 ? (
|
||||
tags.map((tag, index) => (
|
||||
<span
|
||||
key={index}
|
||||
className="flex items-center bg-gray-200 text-gray-700 text-xs font-medium mr-2 px-2.5 py-0.5 rounded"
|
||||
className="flex items-center bg-gray-200 text-gray-700 text-xs font-medium px-2.5 py-0.5 rounded"
|
||||
>
|
||||
{tag}
|
||||
<button
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ const Tags: React.FC = () => {
|
|||
useState<boolean>(false);
|
||||
const [tagToDelete, setTagToDelete] = useState<Tag | null>(null);
|
||||
const [searchQuery, setSearchQuery] = useState<string>('');
|
||||
const [isSearchExpanded, setIsSearchExpanded] = useState(false);
|
||||
const [hoveredTagUid, setHoveredTagUid] = useState<string | null>(null);
|
||||
const [isTagModalOpen, setIsTagModalOpen] = useState<boolean>(false);
|
||||
const [selectedTag, setSelectedTag] = useState<Tag | null>(null);
|
||||
|
|
@ -127,16 +128,52 @@ const Tags: React.FC = () => {
|
|||
<div className="w-full px-2 sm:px-4 lg:px-6 pt-4 pb-8">
|
||||
<div className="w-full">
|
||||
{/* Tags Header */}
|
||||
<div className="flex items-center mb-8">
|
||||
<div className="flex items-center justify-between mb-8">
|
||||
<h2 className="text-2xl font-light">
|
||||
{t('tags.title', 'Tags')}
|
||||
</h2>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setIsSearchExpanded(!isSearchExpanded)}
|
||||
className={`flex items-center transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-inset rounded-lg p-2 ${
|
||||
isSearchExpanded
|
||||
? 'bg-blue-50/70 dark:bg-blue-900/20'
|
||||
: 'bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700'
|
||||
}`}
|
||||
aria-expanded={isSearchExpanded}
|
||||
aria-label={
|
||||
isSearchExpanded
|
||||
? t(
|
||||
'common.hideSearch',
|
||||
'Collapse search panel'
|
||||
)
|
||||
: t('common.showSearch', 'Show search input')
|
||||
}
|
||||
title={
|
||||
isSearchExpanded
|
||||
? t('common.hideSearch', 'Hide search')
|
||||
: t('common.search', 'Search tags')
|
||||
}
|
||||
>
|
||||
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-200" />
|
||||
<span className="sr-only">
|
||||
{isSearchExpanded
|
||||
? t('common.hideSearch', 'Hide search')
|
||||
: t('common.search', 'Search tags')}
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Search Bar with Icon */}
|
||||
<div className="mb-4">
|
||||
<div className="flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm p-2">
|
||||
<MagnifyingGlassIcon className="h-5 w-5 text-gray-500 dark:text-gray-400 mr-2" />
|
||||
{/* Search input section, collapsible */}
|
||||
<div
|
||||
className={`transition-all duration-300 ease-in-out ${
|
||||
isSearchExpanded
|
||||
? 'max-h-24 opacity-100 mb-4'
|
||||
: 'max-h-0 opacity-0 mb-0'
|
||||
} overflow-hidden`}
|
||||
>
|
||||
<div className="flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-4 py-3">
|
||||
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-400 mr-2" />
|
||||
<input
|
||||
type="text"
|
||||
placeholder={t(
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
182
frontend/components/Task/TaskDetails/TaskContentSection.tsx
Normal file
182
frontend/components/Task/TaskDetails/TaskContentSection.tsx
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
import React, { useRef, useState, useEffect } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import {
|
||||
PencilSquareIcon,
|
||||
EyeIcon,
|
||||
PencilIcon,
|
||||
} from '@heroicons/react/24/outline';
|
||||
import MarkdownRenderer from '../../Shared/MarkdownRenderer';
|
||||
|
||||
interface TaskContentSectionProps {
|
||||
content: string;
|
||||
onUpdate: (newContent: string) => Promise<void>;
|
||||
}
|
||||
|
||||
const TaskContentSection: React.FC<TaskContentSectionProps> = ({
|
||||
content,
|
||||
onUpdate,
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
const [isEditing, setIsEditing] = useState(false);
|
||||
const [editedContent, setEditedContent] = useState(content);
|
||||
const [contentTab, setContentTab] = useState<'edit' | 'preview'>('edit');
|
||||
const contentTextareaRef = useRef<HTMLTextAreaElement>(null);
|
||||
|
||||
useEffect(() => {
|
||||
setEditedContent(content);
|
||||
}, [content]);
|
||||
|
||||
useEffect(() => {
|
||||
if (isEditing && contentTextareaRef.current) {
|
||||
contentTextareaRef.current.focus();
|
||||
}
|
||||
}, [isEditing]);
|
||||
|
||||
const handleStartEdit = () => {
|
||||
setIsEditing(true);
|
||||
};
|
||||
|
||||
const handleSave = async () => {
|
||||
if (editedContent !== content) {
|
||||
await onUpdate(editedContent);
|
||||
}
|
||||
setIsEditing(false);
|
||||
};
|
||||
|
||||
const handleCancel = () => {
|
||||
setEditedContent(content);
|
||||
setIsEditing(false);
|
||||
};
|
||||
|
||||
const handleKeyDown = (e: React.KeyboardEvent) => {
|
||||
if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {
|
||||
handleSave();
|
||||
} else if (e.key === 'Escape') {
|
||||
handleCancel();
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h4 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2">
|
||||
{t('task.content', 'Content')}
|
||||
</h4>
|
||||
{isEditing ? (
|
||||
<div className="rounded-lg shadow-sm bg-white dark:bg-gray-900 border-2 border-blue-500 dark:border-blue-400 p-6">
|
||||
<div className="relative">
|
||||
{/* Floating toggle buttons */}
|
||||
<div className="absolute top-2 right-2 z-10 flex space-x-1">
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setContentTab('edit')}
|
||||
className={`p-1.5 rounded-md transition-colors ${
|
||||
contentTab === 'edit'
|
||||
? 'bg-blue-600 text-white'
|
||||
: 'bg-gray-200 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-300 dark:hover:bg-gray-700'
|
||||
}`}
|
||||
title={t('common.edit', 'Edit')}
|
||||
>
|
||||
<PencilIcon className="h-3 w-3" />
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setContentTab('preview')}
|
||||
className={`p-1.5 rounded-md transition-colors ${
|
||||
contentTab === 'preview'
|
||||
? 'bg-blue-600 text-white'
|
||||
: 'bg-gray-200 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-300 dark:hover:bg-gray-700'
|
||||
}`}
|
||||
title={t('common.preview', 'Preview')}
|
||||
>
|
||||
<EyeIcon className="h-3 w-3" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{contentTab === 'edit' ? (
|
||||
<textarea
|
||||
ref={contentTextareaRef}
|
||||
value={editedContent}
|
||||
onChange={(e) =>
|
||||
setEditedContent(e.target.value)
|
||||
}
|
||||
onKeyDown={handleKeyDown}
|
||||
className="w-full min-h-[200px] bg-transparent border-none focus:ring-0 focus:outline-none text-gray-900 dark:text-gray-100 resize-y font-normal pr-20"
|
||||
placeholder={t(
|
||||
'task.contentPlaceholder',
|
||||
'Add content here... (Markdown supported)'
|
||||
)}
|
||||
/>
|
||||
) : (
|
||||
<div className="w-full min-h-[200px] bg-gray-50 dark:bg-gray-800 rounded p-3 pr-20 overflow-y-auto">
|
||||
{editedContent ? (
|
||||
<MarkdownRenderer
|
||||
content={editedContent}
|
||||
className="prose dark:prose-invert max-w-none"
|
||||
/>
|
||||
) : (
|
||||
<p className="text-gray-500 dark:text-gray-400 italic">
|
||||
{t(
|
||||
'task.noContentPreview',
|
||||
'No content to preview. Switch to Edit mode to add content.'
|
||||
)}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex items-center justify-between mt-4 pt-4 border-t border-gray-200 dark:border-gray-700">
|
||||
<span className="text-xs text-gray-500 dark:text-gray-400">
|
||||
{t(
|
||||
'task.contentEditHint',
|
||||
'Press Cmd/Ctrl+Enter to save, Esc to cancel'
|
||||
)}
|
||||
</span>
|
||||
<div className="flex space-x-2">
|
||||
<button
|
||||
onClick={handleSave}
|
||||
className="px-4 py-2 text-sm bg-green-600 dark:bg-green-500 text-white rounded hover:bg-green-700 dark:hover:bg-green-600 transition-colors"
|
||||
>
|
||||
{t('common.save', 'Save')}
|
||||
</button>
|
||||
<button
|
||||
onClick={handleCancel}
|
||||
className="px-4 py-2 text-sm bg-gray-200 dark:bg-gray-800 text-gray-900 dark:text-gray-100 rounded hover:bg-gray-300 dark:hover:bg-gray-700 transition-colors"
|
||||
>
|
||||
{t('common.cancel', 'Cancel')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
) : content ? (
|
||||
<div
|
||||
onClick={handleStartEdit}
|
||||
className="rounded-lg shadow-sm bg-white dark:bg-gray-900 border-2 border-gray-50 dark:border-gray-800 hover:border-gray-200 dark:hover:border-gray-700 p-6 cursor-pointer transition-colors"
|
||||
title={t(
|
||||
'task.clickToEditContent',
|
||||
'Click to edit content'
|
||||
)}
|
||||
>
|
||||
<MarkdownRenderer
|
||||
content={content}
|
||||
className="prose dark:prose-invert max-w-none"
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<div
|
||||
onClick={handleStartEdit}
|
||||
className="rounded-lg shadow-sm bg-white dark:bg-gray-900 border-2 border-gray-50 dark:border-gray-800 hover:border-gray-200 dark:hover:border-gray-700 p-6 cursor-pointer transition-colors"
|
||||
title={t('task.clickToAddContent', 'Click to add content')}
|
||||
>
|
||||
<div className="flex flex-col items-center justify-center py-8 text-gray-500 dark:text-gray-400">
|
||||
<PencilSquareIcon className="h-12 w-12 mb-3 opacity-50" />
|
||||
<span className="text-sm text-center">
|
||||
{t('task.noNotes', 'No content added yet')}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default TaskContentSection;
|
||||
180
frontend/components/Task/TaskDetails/TaskDetailsHeader.tsx
Normal file
180
frontend/components/Task/TaskDetails/TaskDetailsHeader.tsx
Normal file
|
|
@ -0,0 +1,180 @@
|
|||
import React, { useRef, useState, useEffect } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { CheckIcon, XMarkIcon } from '@heroicons/react/24/outline';
|
||||
import TaskPriorityIcon from '../TaskPriorityIcon';
|
||||
import { Task } from '../../../entities/Task';
|
||||
|
||||
interface TaskDetailsHeaderProps {
|
||||
task: Task;
|
||||
onToggleCompletion: () => void;
|
||||
onTitleUpdate: (newTitle: string) => Promise<void>;
|
||||
onEdit: () => void;
|
||||
onDelete: () => void;
|
||||
}
|
||||
|
||||
const TaskDetailsHeader: React.FC<TaskDetailsHeaderProps> = ({
|
||||
task,
|
||||
onToggleCompletion,
|
||||
onTitleUpdate,
|
||||
onEdit,
|
||||
onDelete,
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
const [isEditingTitle, setIsEditingTitle] = useState(false);
|
||||
const [editedTitle, setEditedTitle] = useState(task.name);
|
||||
const [actionsMenuOpen, setActionsMenuOpen] = useState(false);
|
||||
const titleInputRef = useRef<HTMLInputElement>(null);
|
||||
const actionsMenuRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
useEffect(() => {
|
||||
setEditedTitle(task.name);
|
||||
}, [task.name]);
|
||||
|
||||
useEffect(() => {
|
||||
if (isEditingTitle && titleInputRef.current) {
|
||||
titleInputRef.current.focus();
|
||||
titleInputRef.current.select();
|
||||
}
|
||||
}, [isEditingTitle]);
|
||||
|
||||
useEffect(() => {
|
||||
const handleClickOutside = (e: MouseEvent) => {
|
||||
if (
|
||||
actionsMenuOpen &&
|
||||
actionsMenuRef.current &&
|
||||
!actionsMenuRef.current.contains(e.target as Node)
|
||||
) {
|
||||
setActionsMenuOpen(false);
|
||||
}
|
||||
};
|
||||
|
||||
if (actionsMenuOpen) {
|
||||
document.addEventListener('mousedown', handleClickOutside);
|
||||
return () =>
|
||||
document.removeEventListener('mousedown', handleClickOutside);
|
||||
}
|
||||
}, [actionsMenuOpen]);
|
||||
|
||||
const handleStartTitleEdit = () => {
|
||||
setIsEditingTitle(true);
|
||||
};
|
||||
|
||||
const handleSaveTitle = async () => {
|
||||
if (editedTitle.trim() && editedTitle !== task.name) {
|
||||
await onTitleUpdate(editedTitle.trim());
|
||||
}
|
||||
setIsEditingTitle(false);
|
||||
};
|
||||
|
||||
const handleCancelTitleEdit = () => {
|
||||
setEditedTitle(task.name);
|
||||
setIsEditingTitle(false);
|
||||
};
|
||||
|
||||
const handleTitleKeyDown = (e: React.KeyboardEvent) => {
|
||||
if (e.key === 'Enter') {
|
||||
handleSaveTitle();
|
||||
} else if (e.key === 'Escape') {
|
||||
handleCancelTitleEdit();
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="flex items-center justify-between mb-6">
|
||||
<div className="flex items-center space-x-3">
|
||||
<TaskPriorityIcon
|
||||
priority={task.priority}
|
||||
status={task.status}
|
||||
onToggleCompletion={onToggleCompletion}
|
||||
/>
|
||||
<div className="flex flex-col flex-1">
|
||||
{isEditingTitle ? (
|
||||
<div className="flex items-center space-x-2">
|
||||
<input
|
||||
ref={titleInputRef}
|
||||
type="text"
|
||||
value={editedTitle}
|
||||
onChange={(e) => setEditedTitle(e.target.value)}
|
||||
onKeyDown={handleTitleKeyDown}
|
||||
onBlur={handleSaveTitle}
|
||||
className="text-2xl font-normal text-gray-900 dark:text-gray-100 bg-white dark:bg-gray-800 border-2 border-blue-500 dark:border-blue-400 rounded px-2 py-1 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400 w-full"
|
||||
placeholder={t(
|
||||
'task.titlePlaceholder',
|
||||
'Enter task title'
|
||||
)}
|
||||
/>
|
||||
<button
|
||||
onClick={handleSaveTitle}
|
||||
className="p-1.5 text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300 rounded-full transition-colors duration-200"
|
||||
title={t('common.save', 'Save')}
|
||||
>
|
||||
<CheckIcon className="h-5 w-5" />
|
||||
</button>
|
||||
<button
|
||||
onClick={handleCancelTitleEdit}
|
||||
className="p-1.5 text-gray-600 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 rounded-full transition-colors duration-200"
|
||||
title={t('common.cancel', 'Cancel')}
|
||||
>
|
||||
<XMarkIcon className="h-5 w-5" />
|
||||
</button>
|
||||
</div>
|
||||
) : (
|
||||
<h2
|
||||
onClick={handleStartTitleEdit}
|
||||
className="text-2xl font-normal text-gray-900 dark:text-gray-100 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded px-2 py-1 -mx-2 transition-colors"
|
||||
title={t(
|
||||
'task.clickToEditTitle',
|
||||
'Click to edit title'
|
||||
)}
|
||||
>
|
||||
{task.name}
|
||||
</h2>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative" ref={actionsMenuRef}>
|
||||
<button
|
||||
className="px-2 py-1 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100 rounded transition-colors duration-200 text-base"
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
setActionsMenuOpen(!actionsMenuOpen);
|
||||
}}
|
||||
aria-haspopup="true"
|
||||
aria-expanded={actionsMenuOpen}
|
||||
aria-label={t('common.moreActions', 'More actions')}
|
||||
>
|
||||
...
|
||||
</button>
|
||||
{actionsMenuOpen && (
|
||||
<div className="absolute right-0 mt-2 w-40 rounded-lg shadow-lg bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 z-20">
|
||||
<button
|
||||
className="w-full text-left px-3 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-t-lg"
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
setActionsMenuOpen(false);
|
||||
onEdit();
|
||||
}}
|
||||
>
|
||||
{t('common.edit', 'Edit')}
|
||||
</button>
|
||||
<button
|
||||
className="w-full text-left px-3 py-2 text-sm text-red-600 dark:text-red-400 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-b-lg"
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
setActionsMenuOpen(false);
|
||||
onDelete();
|
||||
}}
|
||||
>
|
||||
{t('common.delete', 'Delete')}
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default TaskDetailsHeader;
|
||||
75
frontend/components/Task/TaskDetails/TaskPrioritySection.tsx
Normal file
75
frontend/components/Task/TaskDetails/TaskPrioritySection.tsx
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
import React from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Task, PriorityType } from '../../../entities/Task';
|
||||
|
||||
interface TaskPrioritySectionProps {
|
||||
task: Task;
|
||||
onUpdate: (priority: PriorityType) => Promise<void>;
|
||||
}
|
||||
|
||||
const TaskPrioritySection: React.FC<TaskPrioritySectionProps> = ({
|
||||
task,
|
||||
onUpdate,
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const handlePriorityClick = async (priority: PriorityType) => {
|
||||
await onUpdate(priority);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="min-w-0">
|
||||
<h4 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2">
|
||||
{t('task.priority', 'Priority')}
|
||||
</h4>
|
||||
<div className="grid grid-cols-2 xl:grid-cols-4 gap-2">
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => handlePriorityClick(null)}
|
||||
className={`w-full min-w-0 px-3 py-2 text-sm font-medium rounded transition-colors whitespace-nowrap ${
|
||||
task.priority === null || task.priority === undefined
|
||||
? 'bg-gray-300 dark:bg-gray-600 text-gray-900 dark:text-gray-100'
|
||||
: 'bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 hover:bg-gray-300 dark:hover:bg-gray-600'
|
||||
}`}
|
||||
>
|
||||
{t('priority.none', 'None')}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => handlePriorityClick('low')}
|
||||
className={`w-full min-w-0 px-3 py-2 text-sm font-medium rounded transition-colors whitespace-nowrap ${
|
||||
task.priority === 'low' || task.priority === 0
|
||||
? 'bg-blue-500 dark:bg-blue-600 text-white'
|
||||
: 'bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 hover:bg-blue-200 dark:hover:bg-blue-900/50'
|
||||
}`}
|
||||
>
|
||||
{t('priority.low', 'Low')}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => handlePriorityClick('medium')}
|
||||
className={`w-full min-w-0 px-3 py-2 text-sm font-medium rounded transition-colors whitespace-nowrap ${
|
||||
task.priority === 'medium' || task.priority === 1
|
||||
? 'bg-yellow-500 dark:bg-yellow-600 text-white'
|
||||
: 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-700 dark:text-yellow-300 hover:bg-yellow-200 dark:hover:bg-yellow-900/50'
|
||||
}`}
|
||||
>
|
||||
{t('priority.medium', 'Medium')}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => handlePriorityClick('high')}
|
||||
className={`w-full min-w-0 px-3 py-2 text-sm font-medium rounded transition-colors whitespace-nowrap ${
|
||||
task.priority === 'high' || task.priority === 2
|
||||
? 'bg-red-500 dark:bg-red-600 text-white'
|
||||
: 'bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 hover:bg-red-200 dark:hover:bg-red-900/50'
|
||||
}`}
|
||||
>
|
||||
{t('priority.high', 'High')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default TaskPrioritySection;
|
||||
169
frontend/components/Task/TaskDetails/TaskProjectSection.tsx
Normal file
169
frontend/components/Task/TaskDetails/TaskProjectSection.tsx
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
import React, { useRef, useState, useEffect } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { ArrowRightIcon } from '@heroicons/react/24/outline';
|
||||
import ProjectDropdown from '../../Shared/ProjectDropdown';
|
||||
import { Project } from '../../../entities/Project';
|
||||
import { Task } from '../../../entities/Task';
|
||||
|
||||
interface TaskProjectSectionProps {
|
||||
task: Task;
|
||||
projects: Project[];
|
||||
onProjectSelect: (project: Project) => Promise<void>;
|
||||
onProjectClear: () => Promise<void>;
|
||||
onProjectCreate: (name: string) => Promise<void>;
|
||||
getProjectLink: (project: Project) => string;
|
||||
}
|
||||
|
||||
const TaskProjectSection: React.FC<TaskProjectSectionProps> = ({
|
||||
task,
|
||||
projects,
|
||||
onProjectSelect,
|
||||
onProjectClear,
|
||||
onProjectCreate,
|
||||
getProjectLink,
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
const [projectDropdownOpen, setProjectDropdownOpen] = useState(false);
|
||||
const [projectName, setProjectName] = useState('');
|
||||
const [filteredProjects, setFilteredProjects] = useState<Project[]>([]);
|
||||
const [isCreatingProject, setIsCreatingProject] = useState(false);
|
||||
const projectDropdownRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
useEffect(() => {
|
||||
const handleClickOutside = (e: MouseEvent) => {
|
||||
if (
|
||||
projectDropdownOpen &&
|
||||
projectDropdownRef.current &&
|
||||
!projectDropdownRef.current.contains(e.target as Node)
|
||||
) {
|
||||
setProjectDropdownOpen(false);
|
||||
setProjectName('');
|
||||
}
|
||||
};
|
||||
|
||||
if (projectDropdownOpen) {
|
||||
document.addEventListener('mousedown', handleClickOutside);
|
||||
return () =>
|
||||
document.removeEventListener('mousedown', handleClickOutside);
|
||||
}
|
||||
}, [projectDropdownOpen]);
|
||||
|
||||
const handleProjectSearch = (query: string) => {
|
||||
setProjectName(query);
|
||||
const filtered = projects.filter((p) =>
|
||||
p.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
setFilteredProjects(filtered);
|
||||
};
|
||||
|
||||
const handleProjectSelection = async (project: Project) => {
|
||||
await onProjectSelect(project);
|
||||
setProjectDropdownOpen(false);
|
||||
setProjectName('');
|
||||
};
|
||||
|
||||
const handleClearProject = async () => {
|
||||
await onProjectClear();
|
||||
setProjectDropdownOpen(false);
|
||||
setProjectName('');
|
||||
};
|
||||
|
||||
const handleCreateProjectInline = async (name: string) => {
|
||||
setIsCreatingProject(true);
|
||||
try {
|
||||
await onProjectCreate(name);
|
||||
setProjectDropdownOpen(false);
|
||||
setProjectName('');
|
||||
} finally {
|
||||
setIsCreatingProject(false);
|
||||
}
|
||||
};
|
||||
|
||||
const handleShowAllProjects = () => {
|
||||
setFilteredProjects(projects);
|
||||
};
|
||||
|
||||
return (
|
||||
<div ref={projectDropdownRef}>
|
||||
<h4 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2">
|
||||
{t('task.project', 'Project')}
|
||||
</h4>
|
||||
<div className="rounded-lg shadow-sm bg-white dark:bg-gray-900 border-2 border-gray-50 dark:border-gray-800 hover:border-gray-200 dark:hover:border-gray-700 transition-colors">
|
||||
{projectDropdownOpen ? (
|
||||
<ProjectDropdown
|
||||
projectName={projectName}
|
||||
onProjectSearch={handleProjectSearch}
|
||||
dropdownOpen={projectDropdownOpen}
|
||||
filteredProjects={filteredProjects}
|
||||
onProjectSelection={handleProjectSelection}
|
||||
onCreateProject={handleCreateProjectInline}
|
||||
isCreatingProject={isCreatingProject}
|
||||
onShowAllProjects={handleShowAllProjects}
|
||||
allProjects={projects}
|
||||
selectedProject={null}
|
||||
onClearProject={handleClearProject}
|
||||
/>
|
||||
) : task.Project ? (
|
||||
<div
|
||||
onClick={() => setProjectDropdownOpen(true)}
|
||||
className="bg-gray-50 dark:bg-gray-900 rounded-lg shadow-sm relative cursor-pointer hover:opacity-90 transition-opacity"
|
||||
>
|
||||
<div
|
||||
className="flex items-center justify-center overflow-hidden rounded-t-lg relative"
|
||||
style={{ height: '100px' }}
|
||||
>
|
||||
{task.Project.image_url ? (
|
||||
<img
|
||||
src={task.Project.image_url}
|
||||
alt={task.Project.name}
|
||||
className="w-full h-full object-cover"
|
||||
/>
|
||||
) : (
|
||||
<div className="w-full h-full bg-gradient-to-br from-blue-500 to-purple-600 dark:from-blue-600 dark:to-purple-700"></div>
|
||||
)}
|
||||
</div>
|
||||
<div className="p-3">
|
||||
<div className="flex items-center text-md font-semibold text-gray-900 dark:text-gray-100">
|
||||
<span className="truncate">
|
||||
{task.Project.name}
|
||||
</span>
|
||||
<Link
|
||||
to={getProjectLink(task.Project)}
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
className="p-1.5 rounded-full text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 flex-shrink-0 ml-auto"
|
||||
title={t(
|
||||
'project.viewProject',
|
||||
'Go to project'
|
||||
)}
|
||||
>
|
||||
<ArrowRightIcon className="h-4 w-4" />
|
||||
<span className="sr-only">
|
||||
{t(
|
||||
'project.viewProject',
|
||||
'Go to project'
|
||||
)}
|
||||
</span>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<div
|
||||
onClick={() => setProjectDropdownOpen(true)}
|
||||
className="rounded-lg shadow-sm bg-white dark:bg-gray-900 border-2 border-dashed border-gray-300 dark:border-gray-700 hover:border-gray-400 dark:hover:border-gray-600 p-6 cursor-pointer transition-colors flex items-center justify-center"
|
||||
>
|
||||
<span className="text-sm text-gray-500 dark:text-gray-400 italic">
|
||||
{t(
|
||||
'task.noProject',
|
||||
'No project - Click to assign'
|
||||
)}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default TaskProjectSection;
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
import React from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { ArrowPathIcon } from '@heroicons/react/24/outline';
|
||||
import { Task } from '../../../entities/Task';
|
||||
|
||||
interface TaskRecurringInstanceInfoProps {
|
||||
task: Task;
|
||||
parentTask: Task | null;
|
||||
loadingParent: boolean;
|
||||
}
|
||||
|
||||
const TaskRecurringInstanceInfo: React.FC<TaskRecurringInstanceInfoProps> = ({
|
||||
task,
|
||||
parentTask,
|
||||
loadingParent,
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
if (!task.recurring_parent_id) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="mb-6 p-4 rounded-lg shadow-sm bg-purple-50 dark:bg-purple-900/20">
|
||||
<div className="flex items-start gap-3">
|
||||
<ArrowPathIcon className="h-6 w-6 text-purple-600 dark:text-purple-400 flex-shrink-0 mt-0.5" />
|
||||
<div className="flex-1 min-w-0">
|
||||
<p className="text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
|
||||
{t(
|
||||
'task.instanceOf',
|
||||
'This is an instance of a recurring task'
|
||||
)}
|
||||
</p>
|
||||
{loadingParent && (
|
||||
<div className="flex items-center">
|
||||
<div className="animate-spin rounded-full h-4 w-4 border-b-2 border-gray-500 mr-2"></div>
|
||||
<span className="text-sm text-gray-600 dark:text-gray-400">
|
||||
{t('common.loading', 'Loading parent task...')}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
{parentTask && (
|
||||
<p className="text-sm text-gray-600 dark:text-gray-400">
|
||||
<strong>
|
||||
{t('task.parentTask', 'Parent Task')}:
|
||||
</strong>{' '}
|
||||
<Link
|
||||
to={`/task/${parentTask.uid}`}
|
||||
className="text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 hover:underline font-medium"
|
||||
>
|
||||
{parentTask.name}
|
||||
</Link>
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default TaskRecurringInstanceInfo;
|
||||
86
frontend/components/Task/TaskDetails/TaskSummaryAlerts.tsx
Normal file
86
frontend/components/Task/TaskDetails/TaskSummaryAlerts.tsx
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
import React from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import {
|
||||
XMarkIcon,
|
||||
InformationCircleIcon,
|
||||
ExclamationTriangleIcon,
|
||||
} from '@heroicons/react/24/outline';
|
||||
import { Task } from '../../../entities/Task';
|
||||
import { isTaskOverdue } from '../../../utils/dateUtils';
|
||||
|
||||
interface TaskSummaryAlertsProps {
|
||||
task: Task;
|
||||
summaryMessage: React.ReactNode;
|
||||
isSummaryDismissed: boolean;
|
||||
isOverdueDismissed: boolean;
|
||||
onDismissSummary: () => void;
|
||||
onDismissOverdue: () => void;
|
||||
}
|
||||
|
||||
const TaskSummaryAlerts: React.FC<TaskSummaryAlertsProps> = ({
|
||||
task,
|
||||
summaryMessage,
|
||||
isSummaryDismissed,
|
||||
isOverdueDismissed,
|
||||
onDismissSummary,
|
||||
onDismissOverdue,
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* Summary Alert */}
|
||||
{!isSummaryDismissed && (
|
||||
<div className="mb-4 p-4 bg-blue-50 dark:bg-blue-900/20 border-l-4 border-blue-400 rounded-r-lg relative">
|
||||
<button
|
||||
onClick={onDismissSummary}
|
||||
className="absolute top-2 right-2 p-1 text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-200 transition-colors"
|
||||
aria-label={t('common.close', 'Close')}
|
||||
>
|
||||
<XMarkIcon className="h-4 w-4" />
|
||||
</button>
|
||||
<div className="flex items-center pr-8">
|
||||
<InformationCircleIcon className="h-5 w-5 text-blue-600 dark:text-blue-300 mr-3 flex-shrink-0" />
|
||||
<div>
|
||||
<p className="text-sm font-medium text-blue-900 dark:text-blue-100">
|
||||
{summaryMessage}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Overdue Alert */}
|
||||
{isTaskOverdue(task) && !isOverdueDismissed && (
|
||||
<div className="mb-6 mt-6 p-4 bg-amber-50 dark:bg-amber-900/20 border-l-4 border-amber-400 rounded-r-lg relative">
|
||||
<button
|
||||
onClick={onDismissOverdue}
|
||||
className="absolute top-2 right-2 p-1 text-amber-600 dark:text-amber-400 hover:text-amber-800 dark:hover:text-amber-200 transition-colors"
|
||||
aria-label={t('common.close', 'Close')}
|
||||
>
|
||||
<XMarkIcon className="h-4 w-4" />
|
||||
</button>
|
||||
<div className="flex items-start pr-8">
|
||||
<ExclamationTriangleIcon className="h-5 w-5 text-amber-600 dark:text-amber-400 mr-3 flex-shrink-0 mt-0.5" />
|
||||
<div>
|
||||
<p className="text-sm font-medium text-amber-800 dark:text-amber-200">
|
||||
{t(
|
||||
'task.overdueAlert',
|
||||
"This task was in your plan yesterday and wasn't completed."
|
||||
)}
|
||||
</p>
|
||||
<p className="text-xs text-amber-700 dark:text-amber-300 mt-1">
|
||||
{t(
|
||||
'task.overdueYesterday',
|
||||
'Consider prioritizing this task or breaking it into smaller steps.'
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default TaskSummaryAlerts;
|
||||
134
frontend/components/Task/TaskDetails/TaskTagsSection.tsx
Normal file
134
frontend/components/Task/TaskDetails/TaskTagsSection.tsx
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
import React, { useState, useEffect } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { TagIcon, ArrowRightIcon } from '@heroicons/react/24/outline';
|
||||
import TagInput from '../../Tag/TagInput';
|
||||
import { Task } from '../../../entities/Task';
|
||||
import { Tag } from '../../../entities/Tag';
|
||||
|
||||
interface TaskTagsSectionProps {
|
||||
task: Task;
|
||||
availableTags: Tag[];
|
||||
hasLoadedTags: boolean;
|
||||
isLoadingTags: boolean;
|
||||
onUpdate: (tags: string[]) => Promise<void>;
|
||||
onLoadTags: () => void;
|
||||
}
|
||||
|
||||
const TaskTagsSection: React.FC<TaskTagsSectionProps> = ({
|
||||
task,
|
||||
availableTags,
|
||||
hasLoadedTags,
|
||||
isLoadingTags,
|
||||
onUpdate,
|
||||
onLoadTags,
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
const [isEditing, setIsEditing] = useState(false);
|
||||
const [editedTags, setEditedTags] = useState<string[]>(
|
||||
task?.tags?.map((tag: any) => tag.name) || []
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
setEditedTags(task?.tags?.map((tag: any) => tag.name) || []);
|
||||
}, [task?.tags]);
|
||||
|
||||
const handleStartEdit = () => {
|
||||
setEditedTags(task?.tags?.map((tag: any) => tag.name) || []);
|
||||
if (!hasLoadedTags && !isLoadingTags) {
|
||||
onLoadTags();
|
||||
}
|
||||
setIsEditing(true);
|
||||
};
|
||||
|
||||
const handleSave = async () => {
|
||||
const currentTags = task.tags?.map((tag: any) => tag.name) || [];
|
||||
if (
|
||||
editedTags.length === currentTags.length &&
|
||||
editedTags.every((tag, idx) => tag === currentTags[idx])
|
||||
) {
|
||||
setIsEditing(false);
|
||||
return;
|
||||
}
|
||||
|
||||
await onUpdate(editedTags);
|
||||
setIsEditing(false);
|
||||
};
|
||||
|
||||
const handleCancel = () => {
|
||||
setEditedTags(task.tags?.map((tag: any) => tag.name) || []);
|
||||
setIsEditing(false);
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h4 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2">
|
||||
{t('task.tags', 'Tags')}
|
||||
</h4>
|
||||
<div className="rounded-lg shadow-sm bg-white dark:bg-gray-900 border-2 border-gray-50 dark:border-gray-800 hover:border-gray-200 dark:hover:border-gray-700 transition-colors space-y-3">
|
||||
{isEditing ? (
|
||||
<div className="space-y-3 p-4">
|
||||
<TagInput
|
||||
initialTags={editedTags}
|
||||
onTagsChange={setEditedTags}
|
||||
availableTags={availableTags}
|
||||
onFocus={() => {
|
||||
if (!hasLoadedTags && !isLoadingTags) {
|
||||
onLoadTags();
|
||||
}
|
||||
}}
|
||||
/>
|
||||
<div className="flex justify-end space-x-2">
|
||||
<button
|
||||
onClick={handleSave}
|
||||
className="px-4 py-2 text-sm bg-green-600 dark:bg-green-500 text-white rounded hover:bg-green-700 dark:hover:bg-green-600 transition-colors"
|
||||
>
|
||||
{t('common.save', 'Save')}
|
||||
</button>
|
||||
<button
|
||||
onClick={handleCancel}
|
||||
className="px-4 py-2 text-sm bg-gray-200 dark:bg-gray-800 text-gray-900 dark:text-gray-100 rounded hover:bg-gray-300 dark:hover:bg-gray-700 transition-colors"
|
||||
>
|
||||
{t('common.cancel', 'Cancel')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
) : task.tags && task.tags.length > 0 ? (
|
||||
<div>
|
||||
{task.tags.map((tag: any, index: number) => (
|
||||
<button
|
||||
key={tag.uid || tag.id || tag.name}
|
||||
type="button"
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
handleStartEdit();
|
||||
}}
|
||||
className={`group flex w-full items-center justify-between px-3 py-2.5 bg-white dark:bg-gray-900 shadow-sm hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors ${
|
||||
index === 0 ? 'rounded-t-lg' : ''
|
||||
} ${index === task.tags.length - 1 ? 'rounded-b-lg' : ''}`}
|
||||
>
|
||||
<div className="flex items-center space-x-2 min-w-0">
|
||||
<TagIcon className="h-4 w-4 text-gray-500 dark:text-gray-400" />
|
||||
<span className="text-sm text-gray-900 dark:text-gray-100 truncate">
|
||||
{tag.name}
|
||||
</span>
|
||||
</div>
|
||||
<ArrowRightIcon className="h-4 w-4 text-blue-600 dark:text-blue-400 group-hover:text-blue-700 dark:group-hover:text-blue-300 flex-shrink-0" />
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<div
|
||||
onClick={handleStartEdit}
|
||||
className="p-4 cursor-pointer transition-colors"
|
||||
>
|
||||
<span className="text-sm text-gray-500 dark:text-gray-400 italic">
|
||||
{t('task.noTags', 'No tags')}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default TaskTagsSection;
|
||||
7
frontend/components/Task/TaskDetails/index.ts
Normal file
7
frontend/components/Task/TaskDetails/index.ts
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
export { default as TaskDetailsHeader } from './TaskDetailsHeader';
|
||||
export { default as TaskSummaryAlerts } from './TaskSummaryAlerts';
|
||||
export { default as TaskContentSection } from './TaskContentSection';
|
||||
export { default as TaskProjectSection } from './TaskProjectSection';
|
||||
export { default as TaskTagsSection } from './TaskTagsSection';
|
||||
export { default as TaskPrioritySection } from './TaskPrioritySection';
|
||||
export { default as TaskRecurringInstanceInfo } from './TaskRecurringInstanceInfo';
|
||||
|
|
@ -223,13 +223,16 @@ const TaskModal: React.FC<TaskModalProps> = ({
|
|||
}, [isOpen]);
|
||||
|
||||
// Auto-scroll to subtasks section when modal opens with autoFocusSubtasks
|
||||
// But don't auto-scroll for recurring tasks
|
||||
useEffect(() => {
|
||||
if (isOpen && autoFocusSubtasks) {
|
||||
const isRecurringTask =
|
||||
task.recurrence_type && task.recurrence_type !== 'none';
|
||||
if (isOpen && autoFocusSubtasks && !isRecurringTask) {
|
||||
setTimeout(() => {
|
||||
scrollToSubtasksSection();
|
||||
}, 300);
|
||||
}
|
||||
}, [isOpen, autoFocusSubtasks]);
|
||||
}, [isOpen, autoFocusSubtasks, task.recurrence_type]);
|
||||
|
||||
// Load tags when modal opens if not already loaded
|
||||
useEffect(() => {
|
||||
|
|
|
|||
|
|
@ -140,6 +140,8 @@ const TaskTimeline: React.FC<TaskTimelineProps> = ({ taskUid, refreshKey }) => {
|
|||
}
|
||||
return t('timeline.events.recurrenceTypeChanged');
|
||||
}
|
||||
case 'completion_based_changed':
|
||||
return t('timeline.events.completionBasedChanged');
|
||||
case 'name_changed':
|
||||
return t('timeline.events.nameUpdated');
|
||||
case 'description_changed':
|
||||
|
|
@ -148,6 +150,8 @@ const TaskTimeline: React.FC<TaskTimelineProps> = ({ taskUid, refreshKey }) => {
|
|||
return t('timeline.events.noteUpdated');
|
||||
case 'project_changed':
|
||||
return t('timeline.events.projectChanged');
|
||||
case 'project_id_changed':
|
||||
return t('timeline.events.projectIdChanged');
|
||||
case 'tags_changed':
|
||||
return t('timeline.events.tagsUpdated');
|
||||
case 'archived':
|
||||
|
|
|
|||
|
|
@ -77,25 +77,16 @@ const Tasks: React.FC = () => {
|
|||
let filteredTasks: Task[];
|
||||
|
||||
// Filter by completion status (applies to all views)
|
||||
if (showCompleted) {
|
||||
// Show only completed tasks (done=2 or archived=3)
|
||||
filteredTasks = tasks.filter(
|
||||
(task: Task) =>
|
||||
task.status === 'done' ||
|
||||
task.status === 'archived' ||
|
||||
task.status === 2 ||
|
||||
task.status === 3
|
||||
);
|
||||
} else {
|
||||
// Show only non-completed tasks - exclude done(2) and archived(3)
|
||||
filteredTasks = tasks.filter(
|
||||
(task: Task) =>
|
||||
task.status !== 'done' &&
|
||||
task.status !== 'archived' &&
|
||||
task.status !== 2 &&
|
||||
task.status !== 3
|
||||
);
|
||||
}
|
||||
filteredTasks = showCompleted
|
||||
? tasks // Show everything when completed tasks are toggled on
|
||||
: tasks.filter(
|
||||
// Otherwise hide completed/archived items
|
||||
(task: Task) =>
|
||||
task.status !== 'done' &&
|
||||
task.status !== 'archived' &&
|
||||
task.status !== 2 &&
|
||||
task.status !== 3
|
||||
);
|
||||
|
||||
// Then filter by search query if provided (skip for upcoming view)
|
||||
if (taskSearchQuery.trim() && !isUpcomingView) {
|
||||
|
|
@ -477,8 +468,12 @@ const Tasks: React.FC = () => {
|
|||
};
|
||||
|
||||
return (
|
||||
<div className="w-full px-2 sm:px-4 lg:px-6 pt-4 pb-8">
|
||||
<div className="w-full max-w-5xl mx-auto">
|
||||
<div
|
||||
className={`w-full pt-4 pb-8 ${isUpcomingView ? '' : 'px-2 sm:px-4 lg:px-6'}`}
|
||||
>
|
||||
<div
|
||||
className={`w-full ${isUpcomingView ? '' : 'max-w-5xl mx-auto'}`}
|
||||
>
|
||||
{/* Title row with info button and filters dropdown on the right */}
|
||||
<div
|
||||
className={`flex items-center justify-between gap-2 min-w-0 ${
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ const Views: React.FC = () => {
|
|||
const [views, setViews] = useState<View[]>([]);
|
||||
const [isLoading, setIsLoading] = useState(true);
|
||||
const [searchQuery, setSearchQuery] = useState('');
|
||||
const [isSearchExpanded, setIsSearchExpanded] = useState(false);
|
||||
const [hoveredViewId, setHoveredViewId] = useState<number | null>(null);
|
||||
const [isConfirmDialogOpen, setIsConfirmDialogOpen] = useState(false);
|
||||
const [viewToDelete, setViewToDelete] = useState<View | null>(null);
|
||||
|
|
@ -125,14 +126,50 @@ const Views: React.FC = () => {
|
|||
<div className="w-full px-2 sm:px-4 lg:px-6 pt-4 pb-8">
|
||||
<div className="w-full">
|
||||
{/* Views Header */}
|
||||
<div className="flex items-center mb-8">
|
||||
<div className="flex items-center justify-between mb-8">
|
||||
<h2 className="text-2xl font-light">{t('views.title')}</h2>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setIsSearchExpanded(!isSearchExpanded)}
|
||||
className={`flex items-center transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-inset rounded-lg p-2 ${
|
||||
isSearchExpanded
|
||||
? 'bg-blue-50/70 dark:bg-blue-900/20'
|
||||
: 'bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700'
|
||||
}`}
|
||||
aria-expanded={isSearchExpanded}
|
||||
aria-label={
|
||||
isSearchExpanded
|
||||
? t(
|
||||
'common.hideSearch',
|
||||
'Collapse search panel'
|
||||
)
|
||||
: t('common.showSearch', 'Show search input')
|
||||
}
|
||||
title={
|
||||
isSearchExpanded
|
||||
? t('common.hideSearch', 'Hide search')
|
||||
: t('common.search', 'Search views')
|
||||
}
|
||||
>
|
||||
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-200" />
|
||||
<span className="sr-only">
|
||||
{isSearchExpanded
|
||||
? t('common.hideSearch', 'Hide search')
|
||||
: t('common.search', 'Search views')}
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Search Bar */}
|
||||
<div className="mb-4">
|
||||
<div className="flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm p-2">
|
||||
<MagnifyingGlassIcon className="h-5 w-5 text-gray-500 dark:text-gray-400 mr-2" />
|
||||
{/* Search input section, collapsible */}
|
||||
<div
|
||||
className={`transition-all duration-300 ease-in-out ${
|
||||
isSearchExpanded
|
||||
? 'max-h-24 opacity-100 mb-4'
|
||||
: 'max-h-0 opacity-0 mb-0'
|
||||
} overflow-hidden`}
|
||||
>
|
||||
<div className="flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-4 py-3">
|
||||
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-400 mr-2" />
|
||||
<input
|
||||
type="text"
|
||||
placeholder={t('views.searchPlaceholder')}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,9 @@ export interface TaskEvent {
|
|||
| 'due_date_changed'
|
||||
| 'recurrence_end_date_changed'
|
||||
| 'recurrence_type_changed'
|
||||
| 'completion_based_changed'
|
||||
| 'project_changed'
|
||||
| 'project_id_changed'
|
||||
| 'name_changed'
|
||||
| 'description_changed'
|
||||
| 'note_changed'
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "تاريخ انتهاء التكرار تم تغييره",
|
||||
"recurrenceEndDate": "تاريخ انتهاء التكرار",
|
||||
"recurrence_type_changed": "تم تغيير نوع التكرار",
|
||||
"recurrence_interval_changed": "تم تغيير فترة التكرار"
|
||||
"recurrence_interval_changed": "تم تغيير فترة التكرار",
|
||||
"completionBasedChanged": "تغيير التكرار القائم على الإنجاز",
|
||||
"projectIdChanged": "مُعين لمشروع",
|
||||
"recurrenceType": "نوع التكرار",
|
||||
"recurrenceTypeChanged": "تغيير نوع التكرار"
|
||||
},
|
||||
"justNow": "الآن",
|
||||
"minutesAgo": "{{minutes}} دقيقة مضت",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "يوم من الشهر",
|
||||
"weekOfMonth": "أسبوع من الشهر",
|
||||
"recurrenceEndDate": "تاريخ الانتهاء (اختياري)",
|
||||
"completionBased": "كرر بعد الانتهاء"
|
||||
"completionBased": "كرر بعد الانتهاء",
|
||||
"repeatOn": "التكرار في"
|
||||
},
|
||||
"projectSearchPlaceholder": "ابحث أو أنشئ مشروعًا...",
|
||||
"noMatchingProjects": "لا توجد مشاريع مطابقة",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "حاول أن تكون أكثر تحديدًا بشأن ما يجب القيام به",
|
||||
"noVerb": "ما الإجراء المحدد الذي تحتاج إلى اتخاذه؟ حاول البدء بفعل.",
|
||||
"vague": "حاول البدء بفعل عمل مثل \"اتصل\"، \"اكتب\"، \"حدد موعدًا\"، أو \"ابحث\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "يرجى اختيار يوم واحد على الأقل"
|
||||
},
|
||||
"noteTitle": "عنوان الملاحظة",
|
||||
"noteContent": "محتوى الملاحظة",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "تصفح الصورة",
|
||||
"noNotes": "لا توجد ملاحظات لهذا المشروع.",
|
||||
"deleteProject": "حذف المشروع",
|
||||
"createSuccess": "تم إنشاء المشروع بنجاح!"
|
||||
"createSuccess": "تم إنشاء المشروع بنجاح!",
|
||||
"createdAndAssigned": "تم إنشاء المشروع وتعيينه",
|
||||
"createError": "فشل في إنشاء المشروع",
|
||||
"viewProject": "اذهب إلى المشروع"
|
||||
},
|
||||
"errors": {
|
||||
"required": "هذا الحقل مطلوب",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "المهام الفرعية",
|
||||
"noSubtasks": "لا توجد مهام فرعية بعد",
|
||||
"recentActivity": "النشاط الأخير",
|
||||
"noActivityYet": "لا توجد نشاطات بعد"
|
||||
"noActivityYet": "لا توجد نشاطات بعد",
|
||||
"thisTask": "هذه المهمة",
|
||||
"is": "هي",
|
||||
"and": "و",
|
||||
"dueOn": "مستحقة",
|
||||
"inProject": "في المشروع",
|
||||
"lowPriority": "أولوية منخفضة",
|
||||
"mediumPriority": "أولوية متوسطة",
|
||||
"highPriority": "أولوية عالية",
|
||||
"status": {
|
||||
"notStarted": "لم تبدأ",
|
||||
"inProgress": "قيد التنفيذ",
|
||||
"done": "مكتملة",
|
||||
"archived": "مؤرشفة",
|
||||
"unknown": "جارية"
|
||||
},
|
||||
"noSubtasksClickToAdd": "لا توجد مهام فرعية بعد، انقر لإضافة",
|
||||
"project": "المشروع",
|
||||
"noProject": "لا يوجد مشروع - انقر للتعيين",
|
||||
"tags": "الوسوم",
|
||||
"noTags": "لا توجد وسوم",
|
||||
"priority": "الأولوية",
|
||||
"dueDate": "تاريخ الاستحقاق",
|
||||
"recurringSetup": "إعداد متكرر",
|
||||
"notRecurring": "هذه المهمة ليست متكررة بعد.",
|
||||
"clickToEditTitle": "انقر لتحرير العنوان",
|
||||
"clickToEditContent": "انقر لتحرير المحتوى",
|
||||
"clickToAddContent": "انقر لإضافة محتوى",
|
||||
"clickToEditSubtasks": "انقر لتحرير المهام الفرعية",
|
||||
"clickToAddOrEditSubtasks": "انقر لإضافة أو تحرير المهام الفرعية",
|
||||
"contentPlaceholder": "أضف المحتوى هنا... (يدعم Markdown)",
|
||||
"contentEditHint": "اضغط Cmd/Ctrl+Enter لحفظ، Esc للإلغاء",
|
||||
"noContentPreview": "لا يوجد محتوى للمعاينة. انتقل إلى وضع التحرير لإضافة محتوى.",
|
||||
"deleteConfirmTitle": "حذف المهمة",
|
||||
"deleteConfirmMessage": "هل أنت متأكد أنك تريد حذف هذه المهمة؟ لا يمكن التراجع عن هذا الإجراء.",
|
||||
"noMoreIterations": "لا توجد مزيد من التكرارات المجدولة",
|
||||
"nextOccurrences": "التكرارات القادمة",
|
||||
"nextOccurrencesAfterThis": "التكرارات القادمة بعد ذلك",
|
||||
"inDays": "في {{count}} يوم",
|
||||
"daysAgo": "{{count}} يوم مضى",
|
||||
"tagsUpdated": "تم تحديث العلامات بنجاح",
|
||||
"tagsUpdateError": "فشل في تحديث العلامات",
|
||||
"recurrenceUpdated": "تم تحديث التكرار بنجاح",
|
||||
"recurrenceUpdateError": "فشل في تحديث التكرار",
|
||||
"dueDateUpdated": "تم تحديث تاريخ الاستحقاق بنجاح",
|
||||
"dueDateUpdateError": "فشل في تحديث تاريخ الاستحقاق",
|
||||
"titleUpdated": "تم تحديث عنوان المهمة بنجاح",
|
||||
"titleUpdateError": "فشل في تحديث عنوان المهمة",
|
||||
"contentUpdated": "تم تحديث محتوى المهمة بنجاح",
|
||||
"contentUpdateError": "فشل في تحديث محتوى المهمة",
|
||||
"subtasksUpdated": "تم تحديث المهام الفرعية بنجاح",
|
||||
"subtasksUpdateError": "فشل في تحديث المهام الفرعية",
|
||||
"projectUpdated": "تم تحديث المشروع بنجاح",
|
||||
"projectUpdateError": "فشل في تحديث المشروع",
|
||||
"projectCleared": "تم مسح المشروع بنجاح",
|
||||
"projectClearError": "فشل في مسح المشروع",
|
||||
"priorityUpdated": "تم تحديث الأولوية بنجاح",
|
||||
"priorityUpdateError": "فشل في تحديث الأولوية",
|
||||
"noDueDate": "لا توجد تاريخ استحقاق",
|
||||
"instanceOf": "هذه نسخة من مهمة متكررة",
|
||||
"parentTask": "المهمة الرئيسية",
|
||||
"includingToday": "بما في ذلك اليوم",
|
||||
"has": "يمتلك",
|
||||
"fromProject": "من المشروع"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "جارٍ تحميل المشاريع...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "غير متكرر",
|
||||
"instances": "حالات متكررة"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "أضف مهمة فرعية..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Дата на края на повторението е променена",
|
||||
"recurrenceEndDate": "Дата на края на повторението",
|
||||
"recurrence_type_changed": "Типът на повторение е променен",
|
||||
"recurrence_interval_changed": "Интервалът на повторение е променен"
|
||||
"recurrence_interval_changed": "Интервалът на повторение е променен",
|
||||
"completionBasedChanged": "Променена е повторяемостта на базата на завършване",
|
||||
"projectIdChanged": "Присвоено на проект",
|
||||
"recurrenceType": "Тип повторяемост",
|
||||
"recurrenceTypeChanged": "Променен е типът повторяемост"
|
||||
},
|
||||
"justNow": "Току-що",
|
||||
"minutesAgo": "{{minutes}}м. назад",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Ден от месеца",
|
||||
"weekOfMonth": "Седмица от месеца",
|
||||
"recurrenceEndDate": "Краен срок (по избор)",
|
||||
"completionBased": "Повторете след завършване"
|
||||
"completionBased": "Повторете след завършване",
|
||||
"repeatOn": "Повтаряй на"
|
||||
},
|
||||
"projectSearchPlaceholder": "Търсене или създаване на проект...",
|
||||
"noMatchingProjects": "Няма съвпадащи проекти",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Опитайте да бъдете по-конкретни относно това, което трябва да се направи",
|
||||
"noVerb": "Какво конкретно действие трябва да предприемете? Опитайте да започнете с глагол.",
|
||||
"vague": "Опитайте да започнете с глагол за действие като \"Обади се\", \"Напиши\", \"Насрочи\" или \"Изследвай\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Моля, изберете поне един ден"
|
||||
},
|
||||
"noteTitle": "Заглавие на бележка",
|
||||
"noteContent": "Съдържание на бележка",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Преглед на изображение",
|
||||
"noNotes": "Няма бележки за този проект.",
|
||||
"deleteProject": "Изтрий проекта",
|
||||
"createSuccess": "Проектът беше създаден успешно!"
|
||||
"createSuccess": "Проектът беше създаден успешно!",
|
||||
"createdAndAssigned": "Проектът е създаден и назначен",
|
||||
"createError": "Неуспешно създаване на проект",
|
||||
"viewProject": "Отидете на проекта"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Това поле е задължително",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Подзадачи",
|
||||
"noSubtasks": "Все още няма подзадачи",
|
||||
"recentActivity": "Наскоро извършена дейност",
|
||||
"noActivityYet": "Все още няма активност"
|
||||
"noActivityYet": "Все още няма активност",
|
||||
"thisTask": "Тази задача",
|
||||
"is": "е",
|
||||
"and": "и",
|
||||
"dueOn": "срок",
|
||||
"inProject": "от проект",
|
||||
"lowPriority": "ниска приоритетност",
|
||||
"mediumPriority": "средна приоритетност",
|
||||
"highPriority": "висока приоритетност",
|
||||
"inDays": "в {{count}} дни",
|
||||
"daysAgo": "{{count}} дни назад",
|
||||
"tagsUpdated": "Таговете са актуализирани успешно",
|
||||
"tagsUpdateError": "Неуспешно актуализиране на таговете",
|
||||
"recurrenceUpdated": "Повторяемостта е актуализирана успешно",
|
||||
"recurrenceUpdateError": "Неуспешно актуализиране на повторяемостта",
|
||||
"dueDateUpdated": "Срокът е актуализиран успешно",
|
||||
"dueDateUpdateError": "Неуспешно актуализиране на срока",
|
||||
"titleUpdated": "Заглавието на задачата е актуализирано успешно",
|
||||
"titleUpdateError": "Неуспешно актуализиране на заглавието на задачата",
|
||||
"contentUpdated": "Съдържанието на задачата е актуализирано успешно",
|
||||
"contentUpdateError": "Неуспешно актуализиране на съдържанието на задачата",
|
||||
"subtasksUpdated": "Подзадачите са актуализирани успешно",
|
||||
"subtasksUpdateError": "Неуспешно актуализиране на подзадачите",
|
||||
"projectUpdated": "Проектът е актуализиран успешно",
|
||||
"projectUpdateError": "Неуспешно актуализиране на проекта",
|
||||
"projectCleared": "Проектът е изчистен успешно",
|
||||
"projectClearError": "Неуспешно изчистване на проекта",
|
||||
"priorityUpdated": "Приоритетът е актуализиран успешно",
|
||||
"priorityUpdateError": "Неуспешно актуализиране на приоритета",
|
||||
"status": {
|
||||
"notStarted": "не е започнато",
|
||||
"inProgress": "в процес на изпълнение",
|
||||
"done": "завършено",
|
||||
"archived": "архивирано",
|
||||
"unknown": "в ход"
|
||||
},
|
||||
"noSubtasksClickToAdd": "Все още няма подзадачи, кликнете, за да добавите",
|
||||
"project": "Проект",
|
||||
"noProject": "Няма проект - Кликнете, за да назначите",
|
||||
"tags": "Тагове",
|
||||
"noTags": "Няма тагове",
|
||||
"priority": "Приоритет",
|
||||
"dueDate": "Срок",
|
||||
"recurringSetup": "Настройка на повтарящи се",
|
||||
"notRecurring": "Тази задача все още не е повтаряща се.",
|
||||
"clickToEditTitle": "Кликнете, за да редактирате заглавието",
|
||||
"clickToEditContent": "Кликнете, за да редактирате съдържанието",
|
||||
"clickToAddContent": "Кликнете, за да добавите съдържание",
|
||||
"clickToEditSubtasks": "Кликнете, за да редактирате подзадачите",
|
||||
"clickToAddOrEditSubtasks": "Кликнете, за да добавите или редактирате подзадачите",
|
||||
"contentPlaceholder": "Добавете съдържание тук... (поддържа Markdown)",
|
||||
"contentEditHint": "Натиснете Cmd/Ctrl+Enter, за да запазите, Esc, за да отмените",
|
||||
"noContentPreview": "Няма съдържание за преглед. Превключете в режим Редактиране, за да добавите съдържание.",
|
||||
"deleteConfirmTitle": "Изтриване на задача",
|
||||
"deleteConfirmMessage": "Сигурни ли сте, че искате да изтриете тази задача? Това действие не може да бъде отменено.",
|
||||
"noMoreIterations": "Няма повече планирани итерации",
|
||||
"nextOccurrences": "Следващи случаи",
|
||||
"nextOccurrencesAfterThis": "Следващи случаи след това",
|
||||
"noDueDate": "Няма крайна дата",
|
||||
"instanceOf": "Това е инстанция на повтаряща се задача",
|
||||
"parentTask": "Родителска задача",
|
||||
"includingToday": "включително днес",
|
||||
"has": "има",
|
||||
"fromProject": "от проекта"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Зареждане на проекти...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "неповтарящи се",
|
||||
"instances": "повтарящи се инстанции"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Добавете подзадача..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Ændret slutdato for gentagelse",
|
||||
"recurrenceEndDate": "Slutdato for gentagelse",
|
||||
"recurrence_type_changed": "Ændret gentagelsestype",
|
||||
"recurrence_interval_changed": "Ændret gentagelsesinterval"
|
||||
"recurrence_interval_changed": "Ændret gentagelsesinterval",
|
||||
"completionBasedChanged": "Ændret baseret på fuldførelse",
|
||||
"projectIdChanged": "Tildelt et projekt",
|
||||
"recurrenceType": "Gentagelsestype",
|
||||
"recurrenceTypeChanged": "Gentagelsestype ændret"
|
||||
},
|
||||
"justNow": "Lige nu",
|
||||
"minutesAgo": "{{minutes}}m siden",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Dag i måneden",
|
||||
"weekOfMonth": "Uge i måneden",
|
||||
"recurrenceEndDate": "Slutdato (valgfri)",
|
||||
"completionBased": "Gentag efter fuldførelse"
|
||||
"completionBased": "Gentag efter fuldførelse",
|
||||
"repeatOn": "Gentag på"
|
||||
},
|
||||
"projectSearchPlaceholder": "Søg eller opret et projekt...",
|
||||
"noMatchingProjects": "Ingen matchende projekter",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Prøv at være mere specifik om, hvad der skal gøres",
|
||||
"noVerb": "Hvilken specifik handling skal du tage? Prøv at starte med et verbum.",
|
||||
"vague": "Prøv at starte med et handlingsverb som \"Ring\", \"Skriv\", \"Planlæg\" eller \"Undersøg\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Vælg venligst mindst én dag"
|
||||
},
|
||||
"noteTitle": "Notetitel",
|
||||
"noteContent": "Noteindhold",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Gennemse Billede",
|
||||
"noNotes": "Ingen noter til dette projekt.",
|
||||
"deleteProject": "Slet Projekt",
|
||||
"createSuccess": "Projekt oprettet med succes!"
|
||||
"createSuccess": "Projekt oprettet med succes!",
|
||||
"createdAndAssigned": "Projekt oprettet og tildelt",
|
||||
"createError": "Fejl ved oprettelse af projekt",
|
||||
"viewProject": "Gå til projekt"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Dette felt er påkrævet",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Underopgaver",
|
||||
"noSubtasks": "Ingen underopgaver endnu",
|
||||
"recentActivity": "Seneste aktivitet",
|
||||
"noActivityYet": "Ingen aktivitet endnu"
|
||||
"noActivityYet": "Ingen aktivitet endnu",
|
||||
"thisTask": "Denne opgave",
|
||||
"is": "er",
|
||||
"and": "og",
|
||||
"dueOn": "forfald",
|
||||
"inProject": "fra projekt",
|
||||
"lowPriority": "lav prioritet",
|
||||
"mediumPriority": "medium prioritet",
|
||||
"highPriority": "høj prioritet",
|
||||
"inDays": "om {{count}} dage",
|
||||
"daysAgo": "{{count}} dage siden",
|
||||
"tagsUpdated": "Tags opdateret med succes",
|
||||
"tagsUpdateError": "Kunne ikke opdatere tags",
|
||||
"recurrenceUpdated": "Gentagelse opdateret med succes",
|
||||
"recurrenceUpdateError": "Kunne ikke opdatere gentagelse",
|
||||
"dueDateUpdated": "Forfaldsdato opdateret med succes",
|
||||
"dueDateUpdateError": "Kunne ikke opdatere forfaldsdato",
|
||||
"titleUpdated": "Opgavetitlen blev opdateret med succes",
|
||||
"titleUpdateError": "Fejl ved opdatering af opgavetitel",
|
||||
"contentUpdated": "Opgaveindholdet blev opdateret med succes",
|
||||
"contentUpdateError": "Fejl ved opdatering af opgaveindhold",
|
||||
"subtasksUpdated": "Underopgaver opdateret med succes",
|
||||
"subtasksUpdateError": "Fejl ved opdatering af underopgaver",
|
||||
"projectUpdated": "Projektet blev opdateret med succes",
|
||||
"projectUpdateError": "Fejl ved opdatering af projekt",
|
||||
"projectCleared": "Projektet blev ryddet med succes",
|
||||
"projectClearError": "Fejl ved rydning af projekt",
|
||||
"priorityUpdated": "Prioritet opdateret med succes",
|
||||
"priorityUpdateError": "Fejl ved opdatering af prioritet",
|
||||
"status": {
|
||||
"notStarted": "ikke startet",
|
||||
"inProgress": "i gang",
|
||||
"done": "fuldført",
|
||||
"archived": "arkiveret",
|
||||
"unknown": "gående"
|
||||
},
|
||||
"noSubtasksClickToAdd": "Ingen underopgaver endnu, klik for at tilføje",
|
||||
"project": "Projekt",
|
||||
"noProject": "Ingen projekt - Klik for at tildele",
|
||||
"tags": "Tags",
|
||||
"noTags": "Ingen tags",
|
||||
"priority": "Prioritet",
|
||||
"dueDate": "Forfaldsdato",
|
||||
"recurringSetup": "Gentagen opsætning",
|
||||
"notRecurring": "Denne opgave er ikke gentagende endnu.",
|
||||
"clickToEditTitle": "Klik for at redigere titel",
|
||||
"clickToEditContent": "Klik for at redigere indhold",
|
||||
"clickToAddContent": "Klik for at tilføje indhold",
|
||||
"clickToEditSubtasks": "Klik for at redigere underopgaver",
|
||||
"clickToAddOrEditSubtasks": "Klik for at tilføje eller redigere underopgaver",
|
||||
"contentPlaceholder": "Tilføj indhold her... (Markdown understøttet)",
|
||||
"contentEditHint": "Tryk på Cmd/Ctrl+Enter for at gemme, Esc for at annullere",
|
||||
"noContentPreview": "Ingen indhold at forhåndsvise. Skift til redigeringstilstand for at tilføje indhold.",
|
||||
"deleteConfirmTitle": "Slet Opgave",
|
||||
"deleteConfirmMessage": "Er du sikker på, at du vil slette denne opgave? Denne handling kan ikke fortrydes.",
|
||||
"noMoreIterations": "Ingen flere iterationer planlagt",
|
||||
"nextOccurrences": "Næste Forekomster",
|
||||
"nextOccurrencesAfterThis": "Næste Forekomster Efter Dette",
|
||||
"noDueDate": "Ingen forfaldsdato",
|
||||
"instanceOf": "Dette er en instans af en tilbagevendende opgave",
|
||||
"parentTask": "Overordnet opgave",
|
||||
"includingToday": "inklusive i dag",
|
||||
"has": "har",
|
||||
"fromProject": "fra projektet"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Indlæser projekter...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "ikke-gentagende",
|
||||
"instances": "gentagende instanser"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Tilføj en underopgave..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Das Enddatum der Wiederholung wurde geändert",
|
||||
"recurrenceEndDate": "Enddatum der Wiederholung",
|
||||
"recurrence_type_changed": "Wiederholungsart geändert",
|
||||
"recurrence_interval_changed": "Wiederholungsintervall geändert"
|
||||
"recurrence_interval_changed": "Wiederholungsintervall geändert",
|
||||
"completionBasedChanged": "Änderung der auf Abschluss basierenden Wiederholung",
|
||||
"projectIdChanged": "Einem Projekt zugewiesen",
|
||||
"recurrenceType": "Wiederholungstyp",
|
||||
"recurrenceTypeChanged": "Wiederholungstyp geändert"
|
||||
},
|
||||
"justNow": "Gerade eben",
|
||||
"minutesAgo": "{{minutes}}m her",
|
||||
|
|
@ -181,7 +185,8 @@
|
|||
"status": "Status",
|
||||
"priority": "Priorität",
|
||||
"dueDate": "Fälligkeitsdatum",
|
||||
"note": "Notiz"
|
||||
"note": "Notiz",
|
||||
"repeatOn": "Wiederholen am"
|
||||
},
|
||||
"recurrenceSettings": "Wiederholungseinstellungen",
|
||||
"completionBasedHelp": "Falls aktiviert, wird die nächste Aufgabe basierend auf dem Abschlussdatum statt dem Fälligkeitsdatum erstellt",
|
||||
|
|
@ -203,7 +208,8 @@
|
|||
"short": "Versuchen Sie, genauer zu beschreiben, was getan werden muss",
|
||||
"noVerb": "Welche spezifische Aktion müssen Sie durchführen? Versuchen Sie, mit einem Verb zu beginnen.",
|
||||
"vague": "Versuchen Sie, mit einem Aktionsverb wie \"Anrufen\", \"Schreiben\", \"Planen\" oder \"Forschen\" zu beginnen"
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Bitte wählen Sie mindestens einen Tag aus"
|
||||
},
|
||||
"noteTitle": "Notiz-Titel",
|
||||
"noteContent": "Notiz-Inhalt",
|
||||
|
|
@ -383,7 +389,10 @@
|
|||
"name": "Projektname",
|
||||
"noNotes": "Keine Notizen für dieses Projekt.",
|
||||
"deleteProject": "Projekt löschen",
|
||||
"createSuccess": "Projekt erfolgreich erstellt!"
|
||||
"createSuccess": "Projekt erfolgreich erstellt!",
|
||||
"createdAndAssigned": "Projekt erstellt und zugewiesen",
|
||||
"createError": "Projekt konnte nicht erstellt werden",
|
||||
"viewProject": "Zum Projekt gehen"
|
||||
},
|
||||
"profile": {
|
||||
"title": "Profil-Einstellungen",
|
||||
|
|
@ -595,7 +604,70 @@
|
|||
"subtasks": "Unteraufgaben",
|
||||
"noSubtasks": "Noch keine Unteraufgaben",
|
||||
"recentActivity": "Aktuelle Aktivitäten",
|
||||
"noActivityYet": "Noch keine Aktivität"
|
||||
"noActivityYet": "Noch keine Aktivität",
|
||||
"thisTask": "Diese Aufgabe",
|
||||
"is": "ist",
|
||||
"and": "und",
|
||||
"dueOn": "fällig",
|
||||
"inProject": "aus dem Projekt",
|
||||
"lowPriority": "niedrige Priorität",
|
||||
"mediumPriority": "mittlere Priorität",
|
||||
"highPriority": "hohe Priorität",
|
||||
"inDays": "in {{count}} Tagen",
|
||||
"daysAgo": "{{count}} Tage her",
|
||||
"tagsUpdated": "Tags erfolgreich aktualisiert",
|
||||
"tagsUpdateError": "Fehler beim Aktualisieren der Tags",
|
||||
"recurrenceUpdated": "Wiederholung erfolgreich aktualisiert",
|
||||
"recurrenceUpdateError": "Fehler beim Aktualisieren der Wiederholung",
|
||||
"dueDateUpdated": "Fälligkeitsdatum erfolgreich aktualisiert",
|
||||
"dueDateUpdateError": "Fehler beim Aktualisieren des Fälligkeitsdatums",
|
||||
"titleUpdated": "Aufgabentitel erfolgreich aktualisiert",
|
||||
"titleUpdateError": "Fehler beim Aktualisieren des Aufgabentitels",
|
||||
"contentUpdated": "Aufgabeninhalt erfolgreich aktualisiert",
|
||||
"contentUpdateError": "Fehler beim Aktualisieren des Aufgabeninhalts",
|
||||
"subtasksUpdated": "Unteraufgaben erfolgreich aktualisiert",
|
||||
"subtasksUpdateError": "Fehler beim Aktualisieren der Unteraufgaben",
|
||||
"projectUpdated": "Projekt erfolgreich aktualisiert",
|
||||
"projectUpdateError": "Fehler beim Aktualisieren des Projekts",
|
||||
"projectCleared": "Projekt erfolgreich gelöscht",
|
||||
"projectClearError": "Fehler beim Löschen des Projekts",
|
||||
"priorityUpdated": "Priorität erfolgreich aktualisiert",
|
||||
"priorityUpdateError": "Fehler beim Aktualisieren der Priorität",
|
||||
"status": {
|
||||
"notStarted": "nicht gestartet",
|
||||
"inProgress": "in Bearbeitung",
|
||||
"done": "abgeschlossen",
|
||||
"archived": "archiviert",
|
||||
"unknown": "laufend"
|
||||
},
|
||||
"noSubtasksClickToAdd": "Noch keine Unteraufgaben, klicken Sie zum Hinzufügen",
|
||||
"project": "Projekt",
|
||||
"noProject": "Kein Projekt - Klicken Sie, um zuzuweisen",
|
||||
"tags": "Tags",
|
||||
"noTags": "Keine Tags",
|
||||
"priority": "Priorität",
|
||||
"dueDate": "Fälligkeitsdatum",
|
||||
"recurringSetup": "Wiederkehrende Einrichtung",
|
||||
"notRecurring": "Diese Aufgabe ist noch nicht wiederkehrend.",
|
||||
"clickToEditTitle": "Klicken Sie, um den Titel zu bearbeiten",
|
||||
"clickToEditContent": "Klicken Sie, um den Inhalt zu bearbeiten",
|
||||
"clickToAddContent": "Klicken Sie, um Inhalt hinzuzufügen",
|
||||
"clickToEditSubtasks": "Klicken Sie, um Unteraufgaben zu bearbeiten",
|
||||
"clickToAddOrEditSubtasks": "Klicken Sie, um Unteraufgaben hinzuzufügen oder zu bearbeiten",
|
||||
"contentPlaceholder": "Inhalt hier hinzufügen... (Markdown unterstützt)",
|
||||
"contentEditHint": "Drücken Sie Cmd/Ctrl+Enter, um zu speichern, Esc, um abzubrechen",
|
||||
"noContentPreview": "Kein Inhalt zur Vorschau. Wechseln Sie in den Bearbeitungsmodus, um Inhalte hinzuzufügen.",
|
||||
"deleteConfirmTitle": "Aufgabe löschen",
|
||||
"deleteConfirmMessage": "Sind Sie sicher, dass Sie diese Aufgabe löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"noMoreIterations": "Keine weiteren Iterationen geplant",
|
||||
"nextOccurrences": "Nächste Vorkommen",
|
||||
"nextOccurrencesAfterThis": "Nächste Vorkommen nach diesem",
|
||||
"noDueDate": "Kein Fälligkeitsdatum",
|
||||
"instanceOf": "Dies ist eine Instanz einer wiederkehrenden Aufgabe",
|
||||
"parentTask": "Übergeordnete Aufgabe",
|
||||
"includingToday": "einschließlich heute",
|
||||
"has": "hat",
|
||||
"fromProject": "vom Projekt"
|
||||
},
|
||||
"calendar": {
|
||||
"month": "Monat",
|
||||
|
|
@ -1071,5 +1143,8 @@
|
|||
"nonRecurring": "nicht-wiederkehrend",
|
||||
"instances": "wiederkehrende Instanzen"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Fügen Sie eine Unteraufgabe hinzu..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -359,7 +359,11 @@
|
|||
"recurrenceEndDateChanged": "Η ημερομηνία λήξης επανάληψης άλλαξε",
|
||||
"recurrenceEndDate": "Η ημερομηνία λήξης επανάληψης",
|
||||
"recurrence_type_changed": "Ο τύπος επανάληψης άλλαξε",
|
||||
"recurrence_interval_changed": "Το διάστημα επανάληψης άλλαξε"
|
||||
"recurrence_interval_changed": "Το διάστημα επανάληψης άλλαξε",
|
||||
"completionBasedChanged": "Η επανάληψη με βάση την ολοκλήρωση άλλαξε",
|
||||
"projectIdChanged": "Ανατέθηκε σε έργο",
|
||||
"recurrenceType": "Τύπος επανάληψης",
|
||||
"recurrenceTypeChanged": "Ο τύπος επανάληψης άλλαξε"
|
||||
},
|
||||
"justNow": "Μόλις τώρα",
|
||||
"minutesAgo": "{{minutes}} λεπτά πριν",
|
||||
|
|
@ -539,7 +543,8 @@
|
|||
"monthDay": "Ημέρα του μήνα",
|
||||
"weekOfMonth": "Εβδομάδα του μήνα",
|
||||
"recurrenceEndDate": "Ημερομηνία λήξης (προαιρετικό)",
|
||||
"completionBased": "Επανάληψη μετά την ολοκλήρωση"
|
||||
"completionBased": "Επανάληψη μετά την ολοκλήρωση",
|
||||
"repeatOn": "Επανάληψη στις"
|
||||
},
|
||||
"recurrenceSettings": "Ρυθμίσεις Επανάληψης",
|
||||
"completionBasedHelp": "Αν είναι ενεργοποιημένο, η επόμενη εργασία θα δημιουργηθεί με βάση την ημερομηνία ολοκλήρωσης αντί της ημερομηνίας λήξης",
|
||||
|
|
@ -556,7 +561,8 @@
|
|||
"short": "Προσπαθήστε να είστε πιο συγκεκριμένοι σχετικά με το τι πρέπει να γίνει",
|
||||
"noVerb": "Ποια συγκεκριμένη ενέργεια πρέπει να κάνετε; Δοκιμάστε να ξεκινήσετε με ένα ρήμα.",
|
||||
"vague": "Δοκιμάστε να ξεκινήσετε με ένα ρήμα δράσης όπως \"Καλέστε\", \"Γράψτε\", \"Προγραμματίστε\", ή \"Έρευνα\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Παρακαλώ επιλέξτε τουλάχιστον μία ημέρα"
|
||||
},
|
||||
"projectDescriptionPlaceholder": "Εισάγετε περιγραφή έργου"
|
||||
},
|
||||
|
|
@ -622,7 +628,70 @@
|
|||
"subtasks": "Υποεργασίες",
|
||||
"noSubtasks": "Δεν υπάρχουν υποεργασίες ακόμα",
|
||||
"recentActivity": "Πρόσφατη Δραστηριότητα",
|
||||
"noActivityYet": "Δεν υπάρχει καμία δραστηριότητα ακόμα"
|
||||
"noActivityYet": "Δεν υπάρχει καμία δραστηριότητα ακόμα",
|
||||
"thisTask": "Αυτή η εργασία",
|
||||
"is": "είναι",
|
||||
"and": "και",
|
||||
"dueOn": "προθεσμία",
|
||||
"inProject": "από έργο",
|
||||
"lowPriority": "χαμηλή προτεραιότητα",
|
||||
"mediumPriority": "μεσαία προτεραιότητα",
|
||||
"highPriority": "υψηλή προτεραιότητα",
|
||||
"inDays": "σε {{count}} ημέρες",
|
||||
"daysAgo": "{{count}} ημέρες πριν",
|
||||
"tagsUpdated": "Οι ετικέτες ενημερώθηκαν επιτυχώς",
|
||||
"tagsUpdateError": "Αποτυχία ενημέρωσης ετικετών",
|
||||
"recurrenceUpdated": "Η επανάληψη ενημερώθηκε επιτυχώς",
|
||||
"recurrenceUpdateError": "Αποτυχία ενημέρωσης επανάληψης",
|
||||
"dueDateUpdated": "Η προθεσμία ενημερώθηκε επιτυχώς",
|
||||
"dueDateUpdateError": "Αποτυχία ενημέρωσης προθεσμίας",
|
||||
"titleUpdated": "Ο τίτλος της εργασίας ενημερώθηκε επιτυχώς",
|
||||
"titleUpdateError": "Αποτυχία ενημέρωσης του τίτλου της εργασίας",
|
||||
"contentUpdated": "Το περιεχόμενο της εργασίας ενημερώθηκε επιτυχώς",
|
||||
"contentUpdateError": "Αποτυχία ενημέρωσης του περιεχομένου της εργασίας",
|
||||
"subtasksUpdated": "Οι υποεργασίες ενημερώθηκαν επιτυχώς",
|
||||
"subtasksUpdateError": "Αποτυχία ενημέρωσης των υποεργασιών",
|
||||
"projectUpdated": "Το έργο ενημερώθηκε επιτυχώς",
|
||||
"projectUpdateError": "Αποτυχία ενημέρωσης του έργου",
|
||||
"projectCleared": "Το έργο καθαρίστηκε επιτυχώς",
|
||||
"projectClearError": "Αποτυχία καθαρισμού του έργου",
|
||||
"priorityUpdated": "Η προτεραιότητα ενημερώθηκε επιτυχώς",
|
||||
"priorityUpdateError": "Αποτυχία ενημέρωσης της προτεραιότητας",
|
||||
"status": {
|
||||
"notStarted": "δεν έχει ξεκινήσει",
|
||||
"inProgress": "σε εξέλιξη",
|
||||
"done": "ολοκληρώθηκε",
|
||||
"archived": "αρχειοθετημένο",
|
||||
"unknown": "σε εξέλιξη"
|
||||
},
|
||||
"noSubtasksClickToAdd": "Δεν υπάρχουν υποκαθήκοντα ακόμη, κάντε κλικ για να προσθέσετε",
|
||||
"project": "Έργο",
|
||||
"noProject": "Δεν υπάρχει έργο - Κάντε κλικ για να αναθέσετε",
|
||||
"tags": "Ετικέτες",
|
||||
"noTags": "Δεν υπάρχουν ετικέτες",
|
||||
"priority": "Προτεραιότητα",
|
||||
"dueDate": "Ημερομηνία λήξης",
|
||||
"recurringSetup": "Ρύθμιση επανάληψης",
|
||||
"notRecurring": "Αυτή η εργασία δεν είναι επαναλαμβανόμενη ακόμη.",
|
||||
"clickToEditTitle": "Κάντε κλικ για να επεξεργαστείτε τον τίτλο",
|
||||
"clickToEditContent": "Κάντε κλικ για να επεξεργαστείτε το περιεχόμενο",
|
||||
"clickToAddContent": "Κάντε κλικ για να προσθέσετε περιεχόμενο",
|
||||
"clickToEditSubtasks": "Κάντε κλικ για να επεξεργαστείτε τα υποκαθήκοντα",
|
||||
"clickToAddOrEditSubtasks": "Κάντε κλικ για να προσθέσετε ή να επεξεργαστείτε υποκαθήκοντα",
|
||||
"contentPlaceholder": "Προσθέστε περιεχόμενο εδώ... (υποστηρίζεται Markdown)",
|
||||
"contentEditHint": "Πατήστε Cmd/Ctrl+Enter για αποθήκευση, Esc για ακύρωση",
|
||||
"noContentPreview": "Δεν υπάρχει περιεχόμενο για προεπισκόπηση. Μεταβείτε σε λειτουργία Επεξεργασίας για να προσθέσετε περιεχόμενο.",
|
||||
"deleteConfirmTitle": "Διαγραφή Εργασίας",
|
||||
"deleteConfirmMessage": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή την εργασία; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
|
||||
"noMoreIterations": "Δεν υπάρχουν άλλες προγραμματισμένες επαναλήψεις",
|
||||
"nextOccurrences": "Επόμενες Επαναλήψεις",
|
||||
"nextOccurrencesAfterThis": "Επόμενες Επαναλήψεις Μετά από Αυτή",
|
||||
"noDueDate": "Χωρίς προθεσμία",
|
||||
"instanceOf": "Αυτή είναι μια περίπτωση επαναλαμβανόμενης εργασίας",
|
||||
"parentTask": "Γονική Εργασία",
|
||||
"includingToday": "συμπεριλαμβανομένης της σημερινής ημέρας",
|
||||
"has": "έχει",
|
||||
"fromProject": "από το έργο"
|
||||
},
|
||||
"dateFormats": {
|
||||
"long": "EEEE, d MMMM yyyy",
|
||||
|
|
@ -781,7 +850,10 @@
|
|||
"noNotes": "Δεν υπάρχουν σημειώσεις για αυτό το έργο.",
|
||||
"deleteProject": "Διαγραφή Έργου",
|
||||
"showCompleted": "Εμφάνιση Ολοκληρωμένων",
|
||||
"createSuccess": "Το έργο δημιουργήθηκε με επιτυχία!"
|
||||
"createSuccess": "Το έργο δημιουργήθηκε με επιτυχία!",
|
||||
"createdAndAssigned": "Το έργο δημιουργήθηκε και ανατέθηκε",
|
||||
"createError": "Αποτυχία δημιουργίας έργου",
|
||||
"viewProject": "Μετάβαση στο έργο"
|
||||
},
|
||||
"pomodoro": {
|
||||
"play": "Αναπαραγωγή",
|
||||
|
|
@ -1066,5 +1138,8 @@
|
|||
"nonRecurring": "μη επαναλαμβανόμενο",
|
||||
"instances": "επαναλαμβανόμενες περιπτώσεις"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Προσθέστε μια υποεργασία..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -145,10 +145,12 @@
|
|||
"recurrenceEndDateChanged": "Recurrence end date changed",
|
||||
"recurrence_type_changed": "Recurrence type changed",
|
||||
"recurrence_interval_changed": "Recurrence interval changed",
|
||||
"completionBasedChanged": "Completion-based recurrence changed",
|
||||
"nameUpdated": "Name updated",
|
||||
"descriptionUpdated": "Description updated",
|
||||
"noteUpdated": "Note updated",
|
||||
"projectChanged": "Project changed",
|
||||
"projectIdChanged": "Assigned to a project",
|
||||
"tagsUpdated": "Tags updated",
|
||||
"taskArchived": "Task archived",
|
||||
"todayFlagChanged": "Today Flag Changed",
|
||||
|
|
@ -412,8 +414,10 @@
|
|||
"monthDay": "Day of month",
|
||||
"weekOfMonth": "Week of month",
|
||||
"recurrenceEndDate": "End date (optional)",
|
||||
"completionBased": "Repeat after completion"
|
||||
"completionBased": "Repeat after completion",
|
||||
"repeatOn": "Repeat on"
|
||||
},
|
||||
"selectAtLeastOneDay": "Please select at least one day",
|
||||
"projectSearchPlaceholder": "Search or create a project...",
|
||||
"noMatchingProjects": "No matching projects",
|
||||
"creatingProject": "Creating...",
|
||||
|
|
@ -508,7 +512,10 @@
|
|||
"browseImage": "Browse Image",
|
||||
"noNotes": "No notes for this project.",
|
||||
"deleteProject": "Delete Project",
|
||||
"createSuccess": "Project created successfully!"
|
||||
"createSuccess": "Project created successfully!",
|
||||
"createdAndAssigned": "Project created and assigned",
|
||||
"createError": "Failed to create project",
|
||||
"viewProject": "Go to project"
|
||||
},
|
||||
"errors": {
|
||||
"required": "This field is required",
|
||||
|
|
@ -662,8 +669,74 @@
|
|||
"noNotes": "No content added yet",
|
||||
"subtasks": "Subtasks",
|
||||
"noSubtasks": "No subtasks yet",
|
||||
"noSubtasksClickToAdd": "No subtasks yet, click to add",
|
||||
"recentActivity": "Recent Activity",
|
||||
"noActivityYet": "No activity yet"
|
||||
"noActivityYet": "No activity yet",
|
||||
"project": "Project",
|
||||
"noProject": "No project - Click to assign",
|
||||
"tags": "Tags",
|
||||
"noTags": "No tags",
|
||||
"priority": "Priority",
|
||||
"dueDate": "Due Date",
|
||||
"noDueDate": "No due date",
|
||||
"recurringSetup": "Recurring Setup",
|
||||
"notRecurring": "This task is not recurring yet.",
|
||||
"instanceOf": "This is an instance of a recurring task",
|
||||
"parentTask": "Parent Task",
|
||||
"clickToEditTitle": "Click to edit title",
|
||||
"clickToEditContent": "Click to edit content",
|
||||
"clickToAddContent": "Click to add content",
|
||||
"clickToEditSubtasks": "Click to edit subtasks",
|
||||
"clickToAddOrEditSubtasks": "Click to add or edit subtasks",
|
||||
"contentPlaceholder": "Add content here... (Markdown supported)",
|
||||
"contentEditHint": "Press Cmd/Ctrl+Enter to save, Esc to cancel",
|
||||
"noContentPreview": "No content to preview. Switch to Edit mode to add content.",
|
||||
"deleteConfirmTitle": "Delete Task",
|
||||
"deleteConfirmMessage": "Are you sure you want to delete this task? This action cannot be undone.",
|
||||
"noMoreIterations": "No more iterations scheduled",
|
||||
"nextOccurrences": "Next Occurrences",
|
||||
"nextOccurrencesAfterThis": "Next Occurrences After This",
|
||||
"includingToday": "including today",
|
||||
"thisTask": "This task",
|
||||
"is": "is",
|
||||
"has": "has",
|
||||
"and": "and",
|
||||
"dueOn": "due",
|
||||
"inProject": "from the project",
|
||||
"fromProject": "from the project",
|
||||
"lowPriority": "low priority",
|
||||
"mediumPriority": "medium priority",
|
||||
"highPriority": "high priority",
|
||||
"inDays": "in {{count}} days",
|
||||
"daysAgo": "{{count}} days ago",
|
||||
"tagsUpdated": "Tags updated successfully",
|
||||
"tagsUpdateError": "Failed to update tags",
|
||||
"recurrenceUpdated": "Recurrence updated successfully",
|
||||
"recurrenceUpdateError": "Failed to update recurrence",
|
||||
"dueDateUpdated": "Due date updated successfully",
|
||||
"dueDateUpdateError": "Failed to update due date",
|
||||
"titleUpdated": "Task title updated successfully",
|
||||
"titleUpdateError": "Failed to update task title",
|
||||
"contentUpdated": "Task content updated successfully",
|
||||
"contentUpdateError": "Failed to update task content",
|
||||
"subtasksUpdated": "Subtasks updated successfully",
|
||||
"subtasksUpdateError": "Failed to update subtasks",
|
||||
"projectUpdated": "Project updated successfully",
|
||||
"projectUpdateError": "Failed to update project",
|
||||
"projectCleared": "Project cleared successfully",
|
||||
"projectClearError": "Failed to clear project",
|
||||
"priorityUpdated": "Priority updated successfully",
|
||||
"priorityUpdateError": "Failed to update priority",
|
||||
"status": {
|
||||
"notStarted": "not started",
|
||||
"inProgress": "in progress",
|
||||
"done": "completed",
|
||||
"archived": "archived",
|
||||
"unknown": "ongoing"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Add a subtask..."
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Loading projects...",
|
||||
|
|
|
|||
|
|
@ -359,7 +359,11 @@
|
|||
"recurrenceEndDateChanged": "Fecha de finalización de la recurrencia cambiada",
|
||||
"recurrenceEndDate": "Fecha de finalización de la recurrencia",
|
||||
"recurrence_type_changed": "Tipo de recurrencia cambiado",
|
||||
"recurrence_interval_changed": "Intervalo de recurrencia cambiado"
|
||||
"recurrence_interval_changed": "Intervalo de recurrencia cambiado",
|
||||
"completionBasedChanged": "Recurrencia basada en la finalización cambiada",
|
||||
"projectIdChanged": "Asignado a un proyecto",
|
||||
"recurrenceType": "Tipo de recurrencia",
|
||||
"recurrenceTypeChanged": "Tipo de recurrencia cambiado"
|
||||
},
|
||||
"justNow": "Justo ahora",
|
||||
"minutesAgo": "{{minutes}}m hace",
|
||||
|
|
@ -507,7 +511,8 @@
|
|||
"monthDay": "Día del mes",
|
||||
"weekOfMonth": "Semana del mes",
|
||||
"recurrenceEndDate": "Fecha de fin (opcional)",
|
||||
"completionBased": "Repetir después de completar"
|
||||
"completionBased": "Repetir después de completar",
|
||||
"repeatOn": "Repetir en"
|
||||
},
|
||||
"projectSearchPlaceholder": "Buscar o crear un proyecto...",
|
||||
"noMatchingProjects": "No hay proyectos coincidentes",
|
||||
|
|
@ -528,7 +533,8 @@
|
|||
"short": "Intenta ser más específico sobre lo que necesita hacerse",
|
||||
"noVerb": "¿Qué acción específica necesitas tomar? Intenta comenzar con un verbo.",
|
||||
"vague": "Intenta comenzar con un verbo de acción como \"Llamar\", \"Escribir\", \"Programar\", o \"Investigar\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Por favor, selecciona al menos un día"
|
||||
},
|
||||
"projectDescriptionPlaceholder": "Ingrese la descripción del proyecto"
|
||||
},
|
||||
|
|
@ -579,7 +585,10 @@
|
|||
"noNotes": "No hay notas para este proyecto.",
|
||||
"deleteProject": "Eliminar Proyecto",
|
||||
"showCompleted": "Mostrar Completados",
|
||||
"createSuccess": "¡Proyecto creado exitosamente!"
|
||||
"createSuccess": "¡Proyecto creado exitosamente!",
|
||||
"createdAndAssigned": "Proyecto creado y asignado",
|
||||
"createError": "Error al crear el proyecto",
|
||||
"viewProject": "Ir al proyecto"
|
||||
},
|
||||
"task": {
|
||||
"labels": {
|
||||
|
|
@ -623,7 +632,70 @@
|
|||
"subtasks": "Subtareas",
|
||||
"noSubtasks": "No hay subtareas aún",
|
||||
"recentActivity": "Actividad Reciente",
|
||||
"noActivityYet": "No hay actividad aún"
|
||||
"noActivityYet": "No hay actividad aún",
|
||||
"thisTask": "Esta tarea",
|
||||
"is": "es",
|
||||
"and": "y",
|
||||
"dueOn": "vencida",
|
||||
"inProject": "del proyecto",
|
||||
"lowPriority": "baja prioridad",
|
||||
"mediumPriority": "prioridad media",
|
||||
"highPriority": "alta prioridad",
|
||||
"inDays": "en {{count}} días",
|
||||
"daysAgo": "{{count}} días atrás",
|
||||
"tagsUpdated": "Etiquetas actualizadas con éxito",
|
||||
"tagsUpdateError": "Error al actualizar las etiquetas",
|
||||
"recurrenceUpdated": "Recurrencia actualizada con éxito",
|
||||
"recurrenceUpdateError": "Error al actualizar la recurrencia",
|
||||
"dueDateUpdated": "Fecha de vencimiento actualizada con éxito",
|
||||
"dueDateUpdateError": "Error al actualizar la fecha de vencimiento",
|
||||
"titleUpdated": "Título de la tarea actualizado con éxito",
|
||||
"titleUpdateError": "Error al actualizar el título de la tarea",
|
||||
"contentUpdated": "Contenido de la tarea actualizado con éxito",
|
||||
"contentUpdateError": "Error al actualizar el contenido de la tarea",
|
||||
"subtasksUpdated": "Subtareas actualizadas con éxito",
|
||||
"subtasksUpdateError": "Error al actualizar las subtareas",
|
||||
"projectUpdated": "Proyecto actualizado con éxito",
|
||||
"projectUpdateError": "Error al actualizar el proyecto",
|
||||
"projectCleared": "Proyecto limpiado con éxito",
|
||||
"projectClearError": "Error al limpiar el proyecto",
|
||||
"priorityUpdated": "Prioridad actualizada con éxito",
|
||||
"priorityUpdateError": "Error al actualizar la prioridad",
|
||||
"status": {
|
||||
"notStarted": "no iniciado",
|
||||
"inProgress": "en progreso",
|
||||
"done": "completado",
|
||||
"archived": "archivado",
|
||||
"unknown": "en curso"
|
||||
},
|
||||
"noSubtasksClickToAdd": "No hay subtareas aún, haz clic para agregar",
|
||||
"project": "Proyecto",
|
||||
"noProject": "Sin proyecto - Haz clic para asignar",
|
||||
"tags": "Etiquetas",
|
||||
"noTags": "Sin etiquetas",
|
||||
"priority": "Prioridad",
|
||||
"dueDate": "Fecha de vencimiento",
|
||||
"recurringSetup": "Configuración recurrente",
|
||||
"notRecurring": "Esta tarea aún no es recurrente.",
|
||||
"clickToEditTitle": "Haz clic para editar el título",
|
||||
"clickToEditContent": "Haz clic para editar el contenido",
|
||||
"clickToAddContent": "Haz clic para agregar contenido",
|
||||
"clickToEditSubtasks": "Haz clic para editar subtareas",
|
||||
"clickToAddOrEditSubtasks": "Haz clic para agregar o editar subtareas",
|
||||
"contentPlaceholder": "Agrega contenido aquí... (Markdown soportado)",
|
||||
"contentEditHint": "Presiona Cmd/Ctrl+Enter para guardar, Esc para cancelar",
|
||||
"noContentPreview": "No hay contenido para previsualizar. Cambia a modo de edición para agregar contenido.",
|
||||
"deleteConfirmTitle": "Eliminar Tarea",
|
||||
"deleteConfirmMessage": "¿Estás seguro de que deseas eliminar esta tarea? Esta acción no se puede deshacer.",
|
||||
"noMoreIterations": "No hay más iteraciones programadas",
|
||||
"nextOccurrences": "Próximas Ocurrencias",
|
||||
"nextOccurrencesAfterThis": "Próximas Ocurrencias Después de Esto",
|
||||
"noDueDate": "Sin fecha de vencimiento",
|
||||
"instanceOf": "Esta es una instancia de una tarea recurrente",
|
||||
"parentTask": "Tarea principal",
|
||||
"includingToday": "incluyendo hoy",
|
||||
"has": "tiene",
|
||||
"fromProject": "del proyecto"
|
||||
},
|
||||
"dateIndicators": {
|
||||
"today": "HOY",
|
||||
|
|
@ -1063,5 +1135,8 @@
|
|||
"nonRecurring": "no recurrente",
|
||||
"instances": "instancias recurrentes"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Agregar una subtarea..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Toistuvuuden päättymispäivämäärä on muuttunut",
|
||||
"recurrenceEndDate": "Toistuvuuden päättymispäivämäärä",
|
||||
"recurrence_type_changed": "Toistotyypin muutos",
|
||||
"recurrence_interval_changed": "Toistovälin muutos"
|
||||
"recurrence_interval_changed": "Toistovälin muutos",
|
||||
"completionBasedChanged": "Suoritusperusteinen toistuvuus muuttunut",
|
||||
"projectIdChanged": "Määrätty projektiin",
|
||||
"recurrenceType": "Toistuvuustyyppi",
|
||||
"recurrenceTypeChanged": "Toistuvuustyyppi muuttunut"
|
||||
},
|
||||
"justNow": "Juuri nyt",
|
||||
"minutesAgo": "{{minutes}}m sitten",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Kuukauden päivä",
|
||||
"weekOfMonth": "Kuukauden viikko",
|
||||
"recurrenceEndDate": "Loppupäivämäärä (valinnainen)",
|
||||
"completionBased": "Toista valmistumisen jälkeen"
|
||||
"completionBased": "Toista valmistumisen jälkeen",
|
||||
"repeatOn": "Toista"
|
||||
},
|
||||
"projectSearchPlaceholder": "Etsi tai luo projekti...",
|
||||
"noMatchingProjects": "Ei vastaavia projekteja",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Yritä olla tarkempi siitä, mitä on tehtävä",
|
||||
"noVerb": "Mitä erityistä toimintoa sinun tarvitsee tehdä? Yritä aloittaa verbillä.",
|
||||
"vague": "Yritä aloittaa toimintaverbillä kuten \"Soita\", \"Kirjoita\", \"Aikatauluta\" tai \"Tutki\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Valitse vähintään yksi päivä"
|
||||
},
|
||||
"noteTitle": "Muistion Otsikko",
|
||||
"noteContent": "Muistion Sisältö",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Selaa kuvaa",
|
||||
"noNotes": "Ei muistiinpanoja tälle projektille.",
|
||||
"deleteProject": "Poista projekti",
|
||||
"createSuccess": "Projekti luotiin onnistuneesti!"
|
||||
"createSuccess": "Projekti luotiin onnistuneesti!",
|
||||
"createdAndAssigned": "Projekti luotu ja osoitettu",
|
||||
"createError": "Projektin luominen epäonnistui",
|
||||
"viewProject": "Siirry projektiin"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Tämä kenttä on pakollinen",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Ala-tehtävät",
|
||||
"noSubtasks": "Ei vielä ala-tehtäviä",
|
||||
"recentActivity": "Viimeaikainen toiminta",
|
||||
"noActivityYet": "Ei vielä toimintaa"
|
||||
"noActivityYet": "Ei vielä toimintaa",
|
||||
"thisTask": "Tämä tehtävä",
|
||||
"is": "on",
|
||||
"and": "ja",
|
||||
"dueOn": "eräpäivä",
|
||||
"inProject": "projektista",
|
||||
"lowPriority": "matala prioriteetti",
|
||||
"mediumPriority": "keskitasoinen prioriteetti",
|
||||
"highPriority": "korkea prioriteetti",
|
||||
"inDays": "{{count}} päivän kuluttua",
|
||||
"daysAgo": "{{count}} päivää sitten",
|
||||
"tagsUpdated": "Tunnisteet päivitetty onnistuneesti",
|
||||
"tagsUpdateError": "Tunnisteiden päivittäminen epäonnistui",
|
||||
"recurrenceUpdated": "Toistuvuus päivitetty onnistuneesti",
|
||||
"recurrenceUpdateError": "Toistuvuuden päivittäminen epäonnistui",
|
||||
"dueDateUpdated": "Eräpäivä päivitetty onnistuneesti",
|
||||
"dueDateUpdateError": "Eräpäivän päivittäminen epäonnistui",
|
||||
"titleUpdated": "Tehtävän otsikko päivitetty onnistuneesti",
|
||||
"titleUpdateError": "Tehtävän otsikon päivittäminen epäonnistui",
|
||||
"contentUpdated": "Tehtävän sisältö päivitetty onnistuneesti",
|
||||
"contentUpdateError": "Tehtävän sisällön päivittäminen epäonnistui",
|
||||
"subtasksUpdated": "Ala-tehtävät päivitetty onnistuneesti",
|
||||
"subtasksUpdateError": "Ala-tehtävien päivittäminen epäonnistui",
|
||||
"projectUpdated": "Projekti päivitetty onnistuneesti",
|
||||
"projectUpdateError": "Projektin päivittäminen epäonnistui",
|
||||
"projectCleared": "Projekti tyhjennetty onnistuneesti",
|
||||
"projectClearError": "Projektin tyhjentäminen epäonnistui",
|
||||
"priorityUpdated": "Prioriteetti päivitetty onnistuneesti",
|
||||
"priorityUpdateError": "Prioriteetin päivittäminen epäonnistui",
|
||||
"status": {
|
||||
"notStarted": "ei aloitettu",
|
||||
"inProgress": "käynnissä",
|
||||
"done": "valmis",
|
||||
"archived": "arkistoitu",
|
||||
"unknown": "käynnissä"
|
||||
},
|
||||
"noSubtasksClickToAdd": "Ei alitehtäviä vielä, napsauta lisätäksesi",
|
||||
"project": "Projekti",
|
||||
"noProject": "Ei projektia - Napsauta osoittaaksesi",
|
||||
"tags": "Tunnisteet",
|
||||
"noTags": "Ei tunnisteita",
|
||||
"priority": "Prioriteetti",
|
||||
"dueDate": "Eräpäivä",
|
||||
"recurringSetup": "Toistuva asetukset",
|
||||
"notRecurring": "Tämä tehtävä ei ole vielä toistuva.",
|
||||
"clickToEditTitle": "Napsauta muokataksesi otsikkoa",
|
||||
"clickToEditContent": "Napsauta muokataksesi sisältöä",
|
||||
"clickToAddContent": "Napsauta lisätäksesi sisältöä",
|
||||
"clickToEditSubtasks": "Napsauta muokataksesi alitehtäviä",
|
||||
"clickToAddOrEditSubtasks": "Napsauta lisätäksesi tai muokataksesi alitehtäviä",
|
||||
"contentPlaceholder": "Lisää sisältöä tänne... (Markdown tuettu)",
|
||||
"contentEditHint": "Paina Cmd/Ctrl+Enter tallentaaksesi, Esc peruuttaaksesi",
|
||||
"noContentPreview": "Ei esikatseltavaa sisältöä. Vaihda Muokkaustilaan lisätäksesi sisältöä.",
|
||||
"deleteConfirmTitle": "Poista tehtävä",
|
||||
"deleteConfirmMessage": "Oletko varma, että haluat poistaa tämän tehtävän? Tätä toimintoa ei voi peruuttaa.",
|
||||
"noMoreIterations": "Ei enää aikataulutettuja iteraatioita",
|
||||
"nextOccurrences": "Seuraavat esiintymät",
|
||||
"nextOccurrencesAfterThis": "Seuraavat esiintymät tämän jälkeen",
|
||||
"noDueDate": "Ei määräaikaa",
|
||||
"instanceOf": "Tämä on toistuvan tehtävän instanssi",
|
||||
"parentTask": "Ylätason tehtävä",
|
||||
"includingToday": "mukana tänään",
|
||||
"has": "on",
|
||||
"fromProject": "projektista"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Ladataan projekteja...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "ei-toistuva",
|
||||
"instances": "toistuvat instanssit"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Lisää alitehtävä..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Date de fin de récurrence modifiée",
|
||||
"recurrenceEndDate": "Date de fin de récurrence",
|
||||
"recurrence_type_changed": "Type de récurrence changé",
|
||||
"recurrence_interval_changed": "Intervalle de récurrence changé"
|
||||
"recurrence_interval_changed": "Intervalle de récurrence changé",
|
||||
"completionBasedChanged": "Récurrence basée sur l'achèvement modifiée",
|
||||
"projectIdChanged": "Assigné à un projet",
|
||||
"recurrenceType": "Type de récurrence",
|
||||
"recurrenceTypeChanged": "Type de récurrence modifié"
|
||||
},
|
||||
"justNow": "À l'instant",
|
||||
"minutesAgo": "{{minutes}}m auparavant",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Jour du mois",
|
||||
"weekOfMonth": "Semaine du mois",
|
||||
"recurrenceEndDate": "Date de fin (optionnel)",
|
||||
"completionBased": "Répéter après achèvement"
|
||||
"completionBased": "Répéter après achèvement",
|
||||
"repeatOn": "Répéter le"
|
||||
},
|
||||
"projectSearchPlaceholder": "Rechercher ou créer un projet...",
|
||||
"noMatchingProjects": "Aucun projet correspondant",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Essayez d'être plus spécifique sur ce qui doit être fait",
|
||||
"noVerb": "Quelle action spécifique devez-vous entreprendre ? Essayez de commencer par un verbe.",
|
||||
"vague": "Essayez de commencer par un verbe d'action comme \"Appeler\", \"Écrire\", \"Planifier\" ou \"Rechercher\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Veuillez sélectionner au moins un jour"
|
||||
},
|
||||
"noteTitle": "Titre de la note",
|
||||
"noteContent": "Contenu de la note",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Parcourir l'image",
|
||||
"noNotes": "Aucune note pour ce projet.",
|
||||
"deleteProject": "Supprimer le projet",
|
||||
"createSuccess": "Projet créé avec succès !"
|
||||
"createSuccess": "Projet créé avec succès !",
|
||||
"createdAndAssigned": "Projet créé et attribué",
|
||||
"createError": "Échec de la création du projet",
|
||||
"viewProject": "Aller au projet"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Ce champ est requis",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Sous-tâches",
|
||||
"noSubtasks": "Aucune sous-tâche pour le moment",
|
||||
"recentActivity": "Activité récente",
|
||||
"noActivityYet": "Aucune activité pour le moment"
|
||||
"noActivityYet": "Aucune activité pour le moment",
|
||||
"thisTask": "Cette tâche",
|
||||
"is": "est",
|
||||
"and": "et",
|
||||
"dueOn": "due",
|
||||
"inProject": "du projet",
|
||||
"lowPriority": "priorité basse",
|
||||
"mediumPriority": "priorité moyenne",
|
||||
"highPriority": "priorité élevée",
|
||||
"inDays": "dans {{count}} jours",
|
||||
"daysAgo": "{{count}} jours auparavant",
|
||||
"tagsUpdated": "Étiquettes mises à jour avec succès",
|
||||
"tagsUpdateError": "Échec de la mise à jour des étiquettes",
|
||||
"recurrenceUpdated": "Récurrence mise à jour avec succès",
|
||||
"recurrenceUpdateError": "Échec de la mise à jour de la récurrence",
|
||||
"dueDateUpdated": "Date d'échéance mise à jour avec succès",
|
||||
"dueDateUpdateError": "Échec de la mise à jour de la date d'échéance",
|
||||
"titleUpdated": "Titre de la tâche mis à jour avec succès",
|
||||
"titleUpdateError": "Échec de la mise à jour du titre de la tâche",
|
||||
"contentUpdated": "Contenu de la tâche mis à jour avec succès",
|
||||
"contentUpdateError": "Échec de la mise à jour du contenu de la tâche",
|
||||
"subtasksUpdated": "Sous-tâches mises à jour avec succès",
|
||||
"subtasksUpdateError": "Échec de la mise à jour des sous-tâches",
|
||||
"projectUpdated": "Projet mis à jour avec succès",
|
||||
"projectUpdateError": "Échec de la mise à jour du projet",
|
||||
"projectCleared": "Projet effacé avec succès",
|
||||
"projectClearError": "Échec de l'effacement du projet",
|
||||
"priorityUpdated": "Priorité mise à jour avec succès",
|
||||
"priorityUpdateError": "Échec de la mise à jour de la priorité",
|
||||
"status": {
|
||||
"notStarted": "non commencé",
|
||||
"inProgress": "en cours",
|
||||
"done": "terminé",
|
||||
"archived": "archivé",
|
||||
"unknown": "en cours"
|
||||
},
|
||||
"noSubtasksClickToAdd": "Pas encore de sous-tâches, cliquez pour ajouter",
|
||||
"project": "Projet",
|
||||
"noProject": "Pas de projet - Cliquez pour attribuer",
|
||||
"tags": "Étiquettes",
|
||||
"noTags": "Pas d'étiquettes",
|
||||
"priority": "Priorité",
|
||||
"dueDate": "Date d'échéance",
|
||||
"recurringSetup": "Configuration récurrente",
|
||||
"notRecurring": "Cette tâche n'est pas encore récurrente.",
|
||||
"clickToEditTitle": "Cliquez pour modifier le titre",
|
||||
"clickToEditContent": "Cliquez pour modifier le contenu",
|
||||
"clickToAddContent": "Cliquez pour ajouter du contenu",
|
||||
"clickToEditSubtasks": "Cliquez pour modifier les sous-tâches",
|
||||
"clickToAddOrEditSubtasks": "Cliquez pour ajouter ou modifier des sous-tâches",
|
||||
"contentPlaceholder": "Ajoutez du contenu ici... (Markdown supporté)",
|
||||
"contentEditHint": "Appuyez sur Cmd/Ctrl+Entrée pour enregistrer, Échap pour annuler",
|
||||
"noContentPreview": "Aucun contenu à prévisualiser. Passez en mode Édition pour ajouter du contenu.",
|
||||
"deleteConfirmTitle": "Supprimer la tâche",
|
||||
"deleteConfirmMessage": "Êtes-vous sûr de vouloir supprimer cette tâche ? Cette action ne peut pas être annulée.",
|
||||
"noMoreIterations": "Aucune autre itération prévue",
|
||||
"nextOccurrences": "Prochaines occurrences",
|
||||
"nextOccurrencesAfterThis": "Prochaines occurrences après cela",
|
||||
"noDueDate": "Pas de date d'échéance",
|
||||
"instanceOf": "Ceci est une instance d'une tâche récurrente",
|
||||
"parentTask": "Tâche parente",
|
||||
"includingToday": "y compris aujourd'hui",
|
||||
"has": "a",
|
||||
"fromProject": "du projet"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Chargement des projets...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "non récurrent",
|
||||
"instances": "instances récurrentes"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Ajouter une sous-tâche..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Tanggal akhir pengulangan telah diubah",
|
||||
"recurrenceEndDate": "Tanggal akhir pengulangan",
|
||||
"recurrence_type_changed": "Tipe pengulangan berubah",
|
||||
"recurrence_interval_changed": "Interval pengulangan berubah"
|
||||
"recurrence_interval_changed": "Interval pengulangan berubah",
|
||||
"completionBasedChanged": "Perulangan berbasis penyelesaian diubah",
|
||||
"projectIdChanged": "Ditugaskan ke proyek",
|
||||
"recurrenceType": "Jenis perulangan",
|
||||
"recurrenceTypeChanged": "Jenis perulangan diubah"
|
||||
},
|
||||
"justNow": "Baru saja",
|
||||
"minutesAgo": "{{minutes}}m yang lalu",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Hari dalam bulan",
|
||||
"weekOfMonth": "Minggu dalam bulan",
|
||||
"recurrenceEndDate": "Tanggal akhir (opsional)",
|
||||
"completionBased": "Ulangi setelah penyelesaian"
|
||||
"completionBased": "Ulangi setelah penyelesaian",
|
||||
"repeatOn": "Ulangi pada"
|
||||
},
|
||||
"projectSearchPlaceholder": "Cari atau buat proyek...",
|
||||
"noMatchingProjects": "Tidak ada proyek yang cocok",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Cobalah untuk lebih spesifik tentang apa yang perlu dilakukan",
|
||||
"noVerb": "Tindakan spesifik apa yang perlu Anda ambil? Cobalah mulai dengan kata kerja.",
|
||||
"vague": "Cobalah mulai dengan kata kerja aksi seperti \"Hubungi\", \"Tulis\", \"Jadwalkan\", atau \"Teliti\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Silakan pilih setidaknya satu hari"
|
||||
},
|
||||
"noteTitle": "Judul Catatan",
|
||||
"noteContent": "Konten Catatan",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Telusuri Gambar",
|
||||
"noNotes": "Tidak ada catatan untuk proyek ini.",
|
||||
"deleteProject": "Hapus Proyek",
|
||||
"createSuccess": "Proyek berhasil dibuat!"
|
||||
"createSuccess": "Proyek berhasil dibuat!",
|
||||
"createdAndAssigned": "Proyek dibuat dan ditugaskan",
|
||||
"createError": "Gagal membuat proyek",
|
||||
"viewProject": "Pergi ke proyek"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Kolom ini diperlukan",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Subtugas",
|
||||
"noSubtasks": "Belum ada subtugas",
|
||||
"recentActivity": "Aktivitas Terbaru",
|
||||
"noActivityYet": "Belum ada aktivitas"
|
||||
"noActivityYet": "Belum ada aktivitas",
|
||||
"thisTask": "Tugas ini",
|
||||
"is": "adalah",
|
||||
"and": "dan",
|
||||
"dueOn": "jatuh tempo",
|
||||
"inProject": "dari proyek",
|
||||
"lowPriority": "prioritas rendah",
|
||||
"mediumPriority": "prioritas sedang",
|
||||
"highPriority": "prioritas tinggi",
|
||||
"inDays": "dalam {{count}} hari",
|
||||
"daysAgo": "{{count}} hari yang lalu",
|
||||
"tagsUpdated": "Tag berhasil diperbarui",
|
||||
"tagsUpdateError": "Gagal memperbarui tag",
|
||||
"recurrenceUpdated": "Perulangan berhasil diperbarui",
|
||||
"recurrenceUpdateError": "Gagal memperbarui perulangan",
|
||||
"dueDateUpdated": "Tanggal jatuh tempo berhasil diperbarui",
|
||||
"dueDateUpdateError": "Gagal memperbarui tanggal jatuh tempo",
|
||||
"titleUpdated": "Judul tugas berhasil diperbarui",
|
||||
"titleUpdateError": "Gagal memperbarui judul tugas",
|
||||
"contentUpdated": "Konten tugas berhasil diperbarui",
|
||||
"contentUpdateError": "Gagal memperbarui konten tugas",
|
||||
"subtasksUpdated": "Subtugas berhasil diperbarui",
|
||||
"subtasksUpdateError": "Gagal memperbarui subtugas",
|
||||
"projectUpdated": "Proyek berhasil diperbarui",
|
||||
"projectUpdateError": "Gagal memperbarui proyek",
|
||||
"projectCleared": "Proyek berhasil dibersihkan",
|
||||
"projectClearError": "Gagal membersihkan proyek",
|
||||
"priorityUpdated": "Prioritas berhasil diperbarui",
|
||||
"priorityUpdateError": "Gagal memperbarui prioritas",
|
||||
"status": {
|
||||
"notStarted": "belum dimulai",
|
||||
"inProgress": "sedang berlangsung",
|
||||
"done": "selesai",
|
||||
"archived": "diarsipkan",
|
||||
"unknown": "berlangsung"
|
||||
},
|
||||
"noSubtasksClickToAdd": "Belum ada subtugas, klik untuk menambah",
|
||||
"project": "Proyek",
|
||||
"noProject": "Tidak ada proyek - Klik untuk menugaskan",
|
||||
"tags": "Tag",
|
||||
"noTags": "Tidak ada tag",
|
||||
"priority": "Prioritas",
|
||||
"dueDate": "Tanggal Jatuh Tempo",
|
||||
"recurringSetup": "Pengaturan Berulang",
|
||||
"notRecurring": "Tugas ini belum berulang.",
|
||||
"clickToEditTitle": "Klik untuk mengedit judul",
|
||||
"clickToEditContent": "Klik untuk mengedit konten",
|
||||
"clickToAddContent": "Klik untuk menambah konten",
|
||||
"clickToEditSubtasks": "Klik untuk mengedit subtugas",
|
||||
"clickToAddOrEditSubtasks": "Klik untuk menambah atau mengedit subtugas",
|
||||
"contentPlaceholder": "Tambahkan konten di sini... (Markdown didukung)",
|
||||
"contentEditHint": "Tekan Cmd/Ctrl+Enter untuk menyimpan, Esc untuk membatalkan",
|
||||
"noContentPreview": "Tidak ada konten untuk ditampilkan. Beralih ke mode Edit untuk menambahkan konten.",
|
||||
"deleteConfirmTitle": "Hapus Tugas",
|
||||
"deleteConfirmMessage": "Apakah Anda yakin ingin menghapus tugas ini? Tindakan ini tidak dapat dibatalkan.",
|
||||
"noMoreIterations": "Tidak ada iterasi lain yang dijadwalkan",
|
||||
"nextOccurrences": "Kejadian Berikutnya",
|
||||
"nextOccurrencesAfterThis": "Kejadian Berikutnya Setelah Ini",
|
||||
"noDueDate": "Tidak ada tanggal jatuh tempo",
|
||||
"instanceOf": "Ini adalah instance dari tugas berulang",
|
||||
"parentTask": "Tugas Induk",
|
||||
"includingToday": "termasuk hari ini",
|
||||
"has": "memiliki",
|
||||
"fromProject": "dari proyek"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Memuat proyek...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "tidak berulang",
|
||||
"instances": "instansi berulang"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Tambahkan subtugas..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Data di fine ricorrenza cambiata",
|
||||
"recurrenceEndDate": "Data di fine ricorrenza",
|
||||
"recurrence_type_changed": "Tipo di ricorrenza cambiato",
|
||||
"recurrence_interval_changed": "Intervallo di ricorrenza cambiato"
|
||||
"recurrence_interval_changed": "Intervallo di ricorrenza cambiato",
|
||||
"completionBasedChanged": "Ricorrenza basata sul completamento modificata",
|
||||
"projectIdChanged": "Assegnato a un progetto",
|
||||
"recurrenceType": "Tipo di ricorrenza",
|
||||
"recurrenceTypeChanged": "Tipo di ricorrenza modificato"
|
||||
},
|
||||
"justNow": "Proprio adesso",
|
||||
"minutesAgo": "{{minutes}}m fa",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Giorno del mese",
|
||||
"weekOfMonth": "Settimana del mese",
|
||||
"recurrenceEndDate": "Data di fine (opzionale)",
|
||||
"completionBased": "Ripeti dopo il completamento"
|
||||
"completionBased": "Ripeti dopo il completamento",
|
||||
"repeatOn": "Ripeti il"
|
||||
},
|
||||
"projectSearchPlaceholder": "Cerca o crea un progetto...",
|
||||
"noMatchingProjects": "Nessun progetto corrispondente",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Prova a essere più specifico su cosa deve essere fatto",
|
||||
"noVerb": "Quale azione specifica devi intraprendere? Prova a iniziare con un verbo.",
|
||||
"vague": "Prova a iniziare con un verbo d'azione come \"Chiamare\", \"Scrivere\", \"Programmare\", o \"Ricercare\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Seleziona almeno un giorno"
|
||||
},
|
||||
"noteTitle": "Titolo Nota",
|
||||
"noteContent": "Contenuto Nota",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Sfoglia Immagine",
|
||||
"noNotes": "Nessuna nota per questo progetto.",
|
||||
"deleteProject": "Elimina Progetto",
|
||||
"createSuccess": "Progetto creato con successo!"
|
||||
"createSuccess": "Progetto creato con successo!",
|
||||
"createdAndAssigned": "Progetto creato e assegnato",
|
||||
"createError": "Impossibile creare il progetto",
|
||||
"viewProject": "Vai al progetto"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Questo campo è obbligatorio",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Sottocompiti",
|
||||
"noSubtasks": "Nessun sottocompito ancora",
|
||||
"recentActivity": "Attività recente",
|
||||
"noActivityYet": "Nessuna attività ancora"
|
||||
"noActivityYet": "Nessuna attività ancora",
|
||||
"thisTask": "Questo compito",
|
||||
"is": "è",
|
||||
"and": "e",
|
||||
"dueOn": "scade",
|
||||
"inProject": "dal progetto",
|
||||
"lowPriority": "bassa priorità",
|
||||
"mediumPriority": "priorità media",
|
||||
"highPriority": "alta priorità",
|
||||
"inDays": "in {{count}} giorni",
|
||||
"daysAgo": "{{count}} giorni fa",
|
||||
"tagsUpdated": "Tag aggiornati con successo",
|
||||
"tagsUpdateError": "Aggiornamento dei tag non riuscito",
|
||||
"recurrenceUpdated": "Ricorrenza aggiornata con successo",
|
||||
"recurrenceUpdateError": "Aggiornamento della ricorrenza non riuscito",
|
||||
"dueDateUpdated": "Data di scadenza aggiornata con successo",
|
||||
"dueDateUpdateError": "Aggiornamento della data di scadenza non riuscito",
|
||||
"titleUpdated": "Titolo del compito aggiornato con successo",
|
||||
"titleUpdateError": "Impossibile aggiornare il titolo del compito",
|
||||
"contentUpdated": "Contenuto del compito aggiornato con successo",
|
||||
"contentUpdateError": "Impossibile aggiornare il contenuto del compito",
|
||||
"subtasksUpdated": "Sottocompiti aggiornati con successo",
|
||||
"subtasksUpdateError": "Impossibile aggiornare i sottocompiti",
|
||||
"projectUpdated": "Progetto aggiornato con successo",
|
||||
"projectUpdateError": "Impossibile aggiornare il progetto",
|
||||
"projectCleared": "Progetto cancellato con successo",
|
||||
"projectClearError": "Impossibile cancellare il progetto",
|
||||
"priorityUpdated": "Priorità aggiornata con successo",
|
||||
"priorityUpdateError": "Impossibile aggiornare la priorità",
|
||||
"status": {
|
||||
"notStarted": "non iniziato",
|
||||
"inProgress": "in corso",
|
||||
"done": "completato",
|
||||
"archived": "archiviato",
|
||||
"unknown": "in corso"
|
||||
},
|
||||
"noSubtasksClickToAdd": "Nessuna sottocompito ancora, clicca per aggiungere",
|
||||
"project": "Progetto",
|
||||
"noProject": "Nessun progetto - Clicca per assegnare",
|
||||
"tags": "Tag",
|
||||
"noTags": "Nessun tag",
|
||||
"priority": "Priorità",
|
||||
"dueDate": "Data di scadenza",
|
||||
"recurringSetup": "Impostazione ricorrente",
|
||||
"notRecurring": "Questo compito non è ancora ricorrente.",
|
||||
"clickToEditTitle": "Clicca per modificare il titolo",
|
||||
"clickToEditContent": "Clicca per modificare il contenuto",
|
||||
"clickToAddContent": "Clicca per aggiungere contenuto",
|
||||
"clickToEditSubtasks": "Clicca per modificare i sottocompiti",
|
||||
"clickToAddOrEditSubtasks": "Clicca per aggiungere o modificare i sottocompiti",
|
||||
"contentPlaceholder": "Aggiungi contenuto qui... (Markdown supportato)",
|
||||
"contentEditHint": "Premi Cmd/Ctrl+Invio per salvare, Esc per annullare",
|
||||
"noContentPreview": "Nessun contenuto da visualizzare in anteprima. Passa alla modalità Modifica per aggiungere contenuto.",
|
||||
"deleteConfirmTitle": "Elimina Attività",
|
||||
"deleteConfirmMessage": "Sei sicuro di voler eliminare questa attività? Questa azione non può essere annullata.",
|
||||
"noMoreIterations": "Nessuna iterazione programmata",
|
||||
"nextOccurrences": "Prossime Occorrenze",
|
||||
"nextOccurrencesAfterThis": "Prossime Occorrenze Dopo Questa",
|
||||
"noDueDate": "Nessuna data di scadenza",
|
||||
"instanceOf": "Questa è un'istanza di un'attività ricorrente",
|
||||
"parentTask": "Attività principale",
|
||||
"includingToday": "incluso oggi",
|
||||
"has": "ha",
|
||||
"fromProject": "dal progetto"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Caricamento progetti...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "non ricorrente",
|
||||
"instances": "istanze ricorrenti"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Aggiungi un sottocompito..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "繰り返し終了日が変更されました",
|
||||
"recurrenceEndDate": "繰り返し終了日",
|
||||
"recurrence_type_changed": "繰り返しタイプが変更されました",
|
||||
"recurrence_interval_changed": "繰り返し間隔が変更されました"
|
||||
"recurrence_interval_changed": "繰り返し間隔が変更されました",
|
||||
"completionBasedChanged": "完了ベースの繰り返しが変更されました",
|
||||
"projectIdChanged": "プロジェクトに割り当てられました",
|
||||
"recurrenceType": "繰り返しの種類",
|
||||
"recurrenceTypeChanged": "繰り返しの種類が変更されました"
|
||||
},
|
||||
"justNow": "たった今",
|
||||
"minutesAgo": "{{minutes}}分前",
|
||||
|
|
@ -396,7 +400,8 @@
|
|||
"status": "ステータス",
|
||||
"priority": "優先度",
|
||||
"dueDate": "期限日",
|
||||
"note": "ノート"
|
||||
"note": "ノート",
|
||||
"repeatOn": "繰り返し"
|
||||
},
|
||||
"recurrenceSettings": "繰り返し設定",
|
||||
"completionBasedHelp": "チェックすると、次のタスクは期限日ではなく完了日に基づいて作成されます",
|
||||
|
|
@ -418,7 +423,8 @@
|
|||
"short": "何をする必要があるのか具体的に記述してみてください",
|
||||
"noVerb": "具体的な行動は何ですか? 動詞で始めてみてください。",
|
||||
"vague": "\"電話する\"、\"書く\"、\"予定する\"、\"調査する\"などの動詞で始めてみてください"
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "少なくとも1日を選択してください"
|
||||
},
|
||||
"areaName": "エリア名",
|
||||
"areaDescription": "エリアの説明",
|
||||
|
|
@ -683,7 +689,10 @@
|
|||
"name": "プロジェクト名",
|
||||
"noNotes": "このプロジェクトにはノートがありません。",
|
||||
"deleteProject": "プロジェクトを削除",
|
||||
"createSuccess": "プロジェクトが正常に作成されました!"
|
||||
"createSuccess": "プロジェクトが正常に作成されました!",
|
||||
"createdAndAssigned": "プロジェクトが作成され、割り当てられました",
|
||||
"createError": "プロジェクトの作成に失敗しました",
|
||||
"viewProject": "プロジェクトに移動"
|
||||
},
|
||||
"task": {
|
||||
"suggestions": {
|
||||
|
|
@ -727,7 +736,70 @@
|
|||
"subtasks": "サブタスク",
|
||||
"noSubtasks": "まだサブタスクはありません",
|
||||
"recentActivity": "最近の活動",
|
||||
"noActivityYet": "まだアクティビティはありません"
|
||||
"noActivityYet": "まだアクティビティはありません",
|
||||
"thisTask": "このタスク",
|
||||
"is": "は",
|
||||
"and": "と",
|
||||
"dueOn": "期限",
|
||||
"inProject": "プロジェクトから",
|
||||
"lowPriority": "低優先度",
|
||||
"mediumPriority": "中優先度",
|
||||
"highPriority": "高優先度",
|
||||
"inDays": "{{count}}日以内",
|
||||
"daysAgo": "{{count}}日前",
|
||||
"tagsUpdated": "タグが正常に更新されました",
|
||||
"tagsUpdateError": "タグの更新に失敗しました",
|
||||
"recurrenceUpdated": "繰り返しが正常に更新されました",
|
||||
"recurrenceUpdateError": "繰り返しの更新に失敗しました",
|
||||
"dueDateUpdated": "期限が正常に更新されました",
|
||||
"dueDateUpdateError": "期限の更新に失敗しました",
|
||||
"titleUpdated": "タスクのタイトルが正常に更新されました",
|
||||
"titleUpdateError": "タスクのタイトルの更新に失敗しました",
|
||||
"contentUpdated": "タスクの内容が正常に更新されました",
|
||||
"contentUpdateError": "タスクの内容の更新に失敗しました",
|
||||
"subtasksUpdated": "サブタスクが正常に更新されました",
|
||||
"subtasksUpdateError": "サブタスクの更新に失敗しました",
|
||||
"projectUpdated": "プロジェクトが正常に更新されました",
|
||||
"projectUpdateError": "プロジェクトの更新に失敗しました",
|
||||
"projectCleared": "プロジェクトが正常にクリアされました",
|
||||
"projectClearError": "プロジェクトのクリアに失敗しました",
|
||||
"priorityUpdated": "優先度が正常に更新されました",
|
||||
"priorityUpdateError": "優先度の更新に失敗しました",
|
||||
"status": {
|
||||
"notStarted": "未開始",
|
||||
"inProgress": "進行中",
|
||||
"done": "完了",
|
||||
"archived": "アーカイブ済み",
|
||||
"unknown": "進行中"
|
||||
},
|
||||
"noSubtasksClickToAdd": "まだサブタスクはありません。クリックして追加",
|
||||
"project": "プロジェクト",
|
||||
"noProject": "プロジェクトがありません - 割り当てるにはクリック",
|
||||
"tags": "タグ",
|
||||
"noTags": "タグがありません",
|
||||
"priority": "優先度",
|
||||
"dueDate": "期限日",
|
||||
"recurringSetup": "繰り返し設定",
|
||||
"notRecurring": "このタスクはまだ繰り返しではありません。",
|
||||
"clickToEditTitle": "タイトルを編集するにはクリック",
|
||||
"clickToEditContent": "内容を編集するにはクリック",
|
||||
"clickToAddContent": "内容を追加するにはクリック",
|
||||
"clickToEditSubtasks": "サブタスクを編集するにはクリック",
|
||||
"clickToAddOrEditSubtasks": "サブタスクを追加または編集するにはクリック",
|
||||
"contentPlaceholder": "ここに内容を追加... (Markdown対応)",
|
||||
"contentEditHint": "Cmd/Ctrl+Enterを押して保存、Escを押してキャンセル",
|
||||
"noContentPreview": "プレビューするコンテンツがありません。コンテンツを追加するには編集モードに切り替えてください。",
|
||||
"deleteConfirmTitle": "タスクの削除",
|
||||
"deleteConfirmMessage": "本当にこのタスクを削除してもよろしいですか?この操作は元に戻せません。",
|
||||
"noMoreIterations": "スケジュールされた繰り返しはありません",
|
||||
"nextOccurrences": "次の発生",
|
||||
"nextOccurrencesAfterThis": "これ以降の次の発生",
|
||||
"noDueDate": "期限なし",
|
||||
"instanceOf": "これは定期的なタスクのインスタンスです",
|
||||
"parentTask": "親タスク",
|
||||
"includingToday": "今日を含む",
|
||||
"has": "持っている",
|
||||
"fromProject": "プロジェクトから"
|
||||
},
|
||||
"calendar": {
|
||||
"month": "月",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "非定期的",
|
||||
"instances": "定期的なインスタンス"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "サブタスクを追加..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "반복 종료 날짜가 변경되었습니다",
|
||||
"recurrenceEndDate": "반복 종료 날짜",
|
||||
"recurrence_type_changed": "반복 유형이 변경되었습니다",
|
||||
"recurrence_interval_changed": "반복 간격이 변경되었습니다"
|
||||
"recurrence_interval_changed": "반복 간격이 변경되었습니다",
|
||||
"completionBasedChanged": "완료 기반 반복 변경됨",
|
||||
"projectIdChanged": "프로젝트에 할당됨",
|
||||
"recurrenceType": "반복 유형",
|
||||
"recurrenceTypeChanged": "반복 유형 변경됨"
|
||||
},
|
||||
"justNow": "방금",
|
||||
"minutesAgo": "{{minutes}}분 전",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "월의 일",
|
||||
"weekOfMonth": "월의 주",
|
||||
"recurrenceEndDate": "종료일 (선택 사항)",
|
||||
"completionBased": "완료 후 반복"
|
||||
"completionBased": "완료 후 반복",
|
||||
"repeatOn": "반복"
|
||||
},
|
||||
"projectSearchPlaceholder": "프로젝트 검색 또는 생성...",
|
||||
"noMatchingProjects": "일치하는 프로젝트가 없습니다",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "해야 할 일을 더 구체적으로 작성해보세요",
|
||||
"noVerb": "어떤 특정 행동을 취해야 하나요? 동사로 시작해보세요.",
|
||||
"vague": "\"전화하기\", \"작성하기\", \"일정 잡기\", 또는 \"조사하기\"와 같은 행동 동사로 시작해보세요"
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "하루 이상 선택해 주세요"
|
||||
},
|
||||
"noteTitle": "노트 제목",
|
||||
"noteContent": "노트 내용",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "이미지 찾아보기",
|
||||
"noNotes": "이 프로젝트에 대한 메모가 없습니다.",
|
||||
"deleteProject": "프로젝트 삭제",
|
||||
"createSuccess": "프로젝트가 성공적으로 생성되었습니다!"
|
||||
"createSuccess": "프로젝트가 성공적으로 생성되었습니다!",
|
||||
"createdAndAssigned": "프로젝트가 생성되고 할당되었습니다",
|
||||
"createError": "프로젝트 생성에 실패했습니다",
|
||||
"viewProject": "프로젝트로 이동"
|
||||
},
|
||||
"errors": {
|
||||
"required": "이 필드는 필수입니다",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "하위 작업",
|
||||
"noSubtasks": "아직 하위 작업이 없습니다",
|
||||
"recentActivity": "최근 활동",
|
||||
"noActivityYet": "아직 활동이 없습니다"
|
||||
"noActivityYet": "아직 활동이 없습니다",
|
||||
"thisTask": "이 작업",
|
||||
"is": "는",
|
||||
"and": "그리고",
|
||||
"dueOn": "기한",
|
||||
"inProject": "프로젝트에서",
|
||||
"lowPriority": "낮은 우선순위",
|
||||
"mediumPriority": "중간 우선순위",
|
||||
"highPriority": "높은 우선순위",
|
||||
"inDays": "{{count}}일 내",
|
||||
"daysAgo": "{{count}}일 전",
|
||||
"tagsUpdated": "태그가 성공적으로 업데이트되었습니다",
|
||||
"tagsUpdateError": "태그 업데이트에 실패했습니다",
|
||||
"recurrenceUpdated": "반복이 성공적으로 업데이트되었습니다",
|
||||
"recurrenceUpdateError": "반복 업데이트에 실패했습니다",
|
||||
"dueDateUpdated": "기한이 성공적으로 업데이트되었습니다",
|
||||
"dueDateUpdateError": "기한 업데이트에 실패했습니다",
|
||||
"titleUpdated": "작업 제목이 성공적으로 업데이트되었습니다",
|
||||
"titleUpdateError": "작업 제목 업데이트에 실패했습니다",
|
||||
"contentUpdated": "작업 내용이 성공적으로 업데이트되었습니다",
|
||||
"contentUpdateError": "작업 내용 업데이트에 실패했습니다",
|
||||
"subtasksUpdated": "하위 작업이 성공적으로 업데이트되었습니다",
|
||||
"subtasksUpdateError": "하위 작업 업데이트에 실패했습니다",
|
||||
"projectUpdated": "프로젝트가 성공적으로 업데이트되었습니다",
|
||||
"projectUpdateError": "프로젝트 업데이트에 실패했습니다",
|
||||
"projectCleared": "프로젝트가 성공적으로 삭제되었습니다",
|
||||
"projectClearError": "프로젝트 삭제에 실패했습니다",
|
||||
"priorityUpdated": "우선 순위가 성공적으로 업데이트되었습니다",
|
||||
"priorityUpdateError": "우선 순위 업데이트에 실패했습니다",
|
||||
"status": {
|
||||
"notStarted": "시작되지 않음",
|
||||
"inProgress": "진행 중",
|
||||
"done": "완료됨",
|
||||
"archived": "보관됨",
|
||||
"unknown": "진행 중"
|
||||
},
|
||||
"noSubtasksClickToAdd": "아직 하위 작업이 없습니다. 클릭하여 추가하세요",
|
||||
"project": "프로젝트",
|
||||
"noProject": "프로젝트가 없습니다 - 클릭하여 할당하세요",
|
||||
"tags": "태그",
|
||||
"noTags": "태그가 없습니다",
|
||||
"priority": "우선순위",
|
||||
"dueDate": "마감일",
|
||||
"noDueDate": "마감일이 없습니다",
|
||||
"recurringSetup": "반복 설정",
|
||||
"notRecurring": "이 작업은 아직 반복되지 않습니다.",
|
||||
"clickToEditTitle": "클릭하여 제목 편집",
|
||||
"clickToEditContent": "클릭하여 내용 편집",
|
||||
"clickToAddContent": "클릭하여 내용 추가",
|
||||
"clickToEditSubtasks": "클릭하여 하위 작업 편집",
|
||||
"clickToAddOrEditSubtasks": "클릭하여 하위 작업 추가 또는 편집",
|
||||
"contentPlaceholder": "여기에 내용을 추가하세요... (Markdown 지원)",
|
||||
"contentEditHint": "Cmd/Ctrl+Enter를 눌러 저장하고, Esc를 눌러 취소하세요",
|
||||
"noContentPreview": "미리보기할 내용이 없습니다. 내용을 추가하려면 편집 모드로 전환하세요.",
|
||||
"deleteConfirmTitle": "작업 삭제",
|
||||
"deleteConfirmMessage": "이 작업을 삭제하시겠습니까? 이 작업은 실행 취소할 수 없습니다.",
|
||||
"noMoreIterations": "더 이상 예약된 반복이 없습니다",
|
||||
"nextOccurrences": "다음 발생",
|
||||
"nextOccurrencesAfterThis": "이후의 다음 발생",
|
||||
"instanceOf": "이것은 반복 작업의 인스턴스입니다",
|
||||
"parentTask": "상위 작업",
|
||||
"includingToday": "오늘 포함",
|
||||
"has": "있음",
|
||||
"fromProject": "프로젝트에서"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "프로젝트 로딩 중...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "비반복",
|
||||
"instances": "반복 인스턴스"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "하위 작업 추가..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Einddatum van herhaling gewijzigd",
|
||||
"recurrenceEndDate": "Einddatum van herhaling",
|
||||
"recurrence_type_changed": "Herhalings type gewijzigd",
|
||||
"recurrence_interval_changed": "Herhalingsinterval gewijzigd"
|
||||
"recurrence_interval_changed": "Herhalingsinterval gewijzigd",
|
||||
"completionBasedChanged": "Voltooiingsgebaseerde herhaling gewijzigd",
|
||||
"projectIdChanged": "Toegewezen aan een project",
|
||||
"recurrenceType": "Herhalings type",
|
||||
"recurrenceTypeChanged": "Herhalings type gewijzigd"
|
||||
},
|
||||
"justNow": "Net nu",
|
||||
"minutesAgo": "{{minutes}}m geleden",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Dag van de maand",
|
||||
"weekOfMonth": "Week van de maand",
|
||||
"recurrenceEndDate": "Einddatum (optioneel)",
|
||||
"completionBased": "Herhaal na voltooiing"
|
||||
"completionBased": "Herhaal na voltooiing",
|
||||
"repeatOn": "Herhaal op"
|
||||
},
|
||||
"projectSearchPlaceholder": "Zoek of maak een project...",
|
||||
"noMatchingProjects": "Geen overeenkomende projecten",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Probeer specifieker te zijn over wat er gedaan moet worden",
|
||||
"noVerb": "Welke specifieke actie moet je ondernemen? Probeer te beginnen met een werkwoord.",
|
||||
"vague": "Probeer te beginnen met een actie werkwoord zoals \"Bel\", \"Schrijf\", \"Plan\" of \"Onderzoek\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Selecteer alstublieft minimaal één dag"
|
||||
},
|
||||
"noteTitle": "Notitietitel",
|
||||
"noteContent": "Notitie-inhoud",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Afbeelding Bladeren",
|
||||
"noNotes": "Geen notities voor dit project.",
|
||||
"deleteProject": "Project Verwijderen",
|
||||
"createSuccess": "Project succesvol aangemaakt!"
|
||||
"createSuccess": "Project succesvol aangemaakt!",
|
||||
"createdAndAssigned": "Project aangemaakt en toegewezen",
|
||||
"createError": "Mislukt om project aan te maken",
|
||||
"viewProject": "Ga naar project"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Dit veld is verplicht",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Subtaken",
|
||||
"noSubtasks": "Nog geen subtaken",
|
||||
"recentActivity": "Recente Activiteit",
|
||||
"noActivityYet": "Nog geen activiteit"
|
||||
"noActivityYet": "Nog geen activiteit",
|
||||
"thisTask": "Deze taak",
|
||||
"is": "is",
|
||||
"and": "en",
|
||||
"dueOn": "vervaldatum",
|
||||
"inProject": "van project",
|
||||
"lowPriority": "lage prioriteit",
|
||||
"mediumPriority": "gemiddelde prioriteit",
|
||||
"highPriority": "hoge prioriteit",
|
||||
"inDays": "in {{count}} dagen",
|
||||
"daysAgo": "{{count}} dagen geleden",
|
||||
"tagsUpdated": "Tags succesvol bijgewerkt",
|
||||
"tagsUpdateError": "Bijwerken van tags is mislukt",
|
||||
"recurrenceUpdated": "Herhaling succesvol bijgewerkt",
|
||||
"recurrenceUpdateError": "Bijwerken van herhaling is mislukt",
|
||||
"dueDateUpdated": "Vervaldatum succesvol bijgewerkt",
|
||||
"dueDateUpdateError": "Bijwerken van vervaldatum is mislukt",
|
||||
"titleUpdated": "Taak titel succesvol bijgewerkt",
|
||||
"titleUpdateError": "Het bijwerken van de taak titel is mislukt",
|
||||
"contentUpdated": "Taak inhoud succesvol bijgewerkt",
|
||||
"contentUpdateError": "Het bijwerken van de taak inhoud is mislukt",
|
||||
"subtasksUpdated": "Subtaken succesvol bijgewerkt",
|
||||
"subtasksUpdateError": "Het bijwerken van subtaken is mislukt",
|
||||
"projectUpdated": "Project succesvol bijgewerkt",
|
||||
"projectUpdateError": "Het bijwerken van het project is mislukt",
|
||||
"projectCleared": "Project succesvol gewist",
|
||||
"projectClearError": "Het wissen van het project is mislukt",
|
||||
"priorityUpdated": "Prioriteit succesvol bijgewerkt",
|
||||
"priorityUpdateError": "Het bijwerken van de prioriteit is mislukt",
|
||||
"status": {
|
||||
"notStarted": "niet gestart",
|
||||
"inProgress": "bezig",
|
||||
"done": "voltooid",
|
||||
"archived": "gearchiveerd",
|
||||
"unknown": "lopende"
|
||||
},
|
||||
"noSubtasksClickToAdd": "Nog geen subtaken, klik om toe te voegen",
|
||||
"project": "Project",
|
||||
"noProject": "Geen project - Klik om toe te wijzen",
|
||||
"tags": "Tags",
|
||||
"noTags": "Geen tags",
|
||||
"priority": "Prioriteit",
|
||||
"dueDate": "Vervaldatum",
|
||||
"noDueDate": "Geen vervaldatum",
|
||||
"recurringSetup": "Terugkerende instellingen",
|
||||
"notRecurring": "Deze taak is nog niet terugkerend.",
|
||||
"clickToEditTitle": "Klik om titel te bewerken",
|
||||
"clickToEditContent": "Klik om inhoud te bewerken",
|
||||
"clickToAddContent": "Klik om inhoud toe te voegen",
|
||||
"clickToEditSubtasks": "Klik om subtaken te bewerken",
|
||||
"clickToAddOrEditSubtasks": "Klik om subtaken toe te voegen of te bewerken",
|
||||
"contentPlaceholder": "Voeg hier inhoud toe... (Markdown ondersteund)",
|
||||
"contentEditHint": "Druk op Cmd/Ctrl+Enter om op te slaan, Esc om te annuleren",
|
||||
"noContentPreview": "Geen inhoud om te bekijken. Schakel over naar de bewerkingsmodus om inhoud toe te voegen.",
|
||||
"deleteConfirmTitle": "Taak Verwijderen",
|
||||
"deleteConfirmMessage": "Weet je zeker dat je deze taak wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.",
|
||||
"noMoreIterations": "Geen verdere iteraties gepland",
|
||||
"nextOccurrences": "Volgende Voorvallen",
|
||||
"nextOccurrencesAfterThis": "Volgende Voorvallen Na Dit",
|
||||
"instanceOf": "Dit is een instantie van een terugkerende taak",
|
||||
"parentTask": "Bovenliggende Taak",
|
||||
"includingToday": "inclusief vandaag",
|
||||
"has": "heeft",
|
||||
"fromProject": "van het project"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Projecten laden...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "niet-herhalend",
|
||||
"instances": "herhalende instanties"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Voeg een subtaak toe..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Endringsdato for gjentakelse endret",
|
||||
"recurrenceEndDate": "Endringsdato for gjentakelse",
|
||||
"recurrence_type_changed": "Gjentakelsestype endret",
|
||||
"recurrence_interval_changed": "Gjentakelsesintervall endret"
|
||||
"recurrence_interval_changed": "Gjentakelsesintervall endret",
|
||||
"completionBasedChanged": "Fullføring-basert gjentakelse endret",
|
||||
"projectIdChanged": "Tildelt et prosjekt",
|
||||
"recurrenceType": "Gjentakelsestype",
|
||||
"recurrenceTypeChanged": "Gjentakelsestype endret"
|
||||
},
|
||||
"justNow": "Akkurat nå",
|
||||
"minutesAgo": "{{minutes}}m siden",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Dag i måneden",
|
||||
"weekOfMonth": "Uke i måneden",
|
||||
"recurrenceEndDate": "Sluttdato (valgfritt)",
|
||||
"completionBased": "Gjenta etter fullføring"
|
||||
"completionBased": "Gjenta etter fullføring",
|
||||
"repeatOn": "Gjenta på"
|
||||
},
|
||||
"projectSearchPlaceholder": "Søk eller opprett et prosjekt...",
|
||||
"noMatchingProjects": "Ingen matchende prosjekter",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Prøv å være mer spesifikk om hva som må gjøres",
|
||||
"noVerb": "Hvilken spesifikk handling må du ta? Prøv å starte med et verb.",
|
||||
"vague": "Prøv å starte med et handlingsverb som \"Ring\", \"Skriv\", \"Planlegg\" eller \"Undersøk\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Vennligst velg minst én dag"
|
||||
},
|
||||
"noteTitle": "Notattittel",
|
||||
"noteContent": "Notatinnhold",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Bla gjennom bilde",
|
||||
"noNotes": "Ingen notater for dette prosjektet.",
|
||||
"deleteProject": "Slett prosjekt",
|
||||
"createSuccess": "Prosjekt opprettet med suksess!"
|
||||
"createSuccess": "Prosjekt opprettet med suksess!",
|
||||
"createdAndAssigned": "Prosjekt opprettet og tildelt",
|
||||
"createError": "Kunne ikke opprette prosjekt",
|
||||
"viewProject": "Gå til prosjekt"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Dette feltet er påkrevd",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Undertasker",
|
||||
"noSubtasks": "Ingen undertasker ennå",
|
||||
"recentActivity": "Nylig aktivitet",
|
||||
"noActivityYet": "Ingen aktivitet ennå"
|
||||
"noActivityYet": "Ingen aktivitet ennå",
|
||||
"project": "Prosjekt",
|
||||
"tags": "Merker",
|
||||
"priority": "Prioritet",
|
||||
"dueDate": "Forfallsdato",
|
||||
"recurringSetup": "Gjentakende oppsett",
|
||||
"thisTask": "Denne oppgaven",
|
||||
"is": "er",
|
||||
"and": "og",
|
||||
"dueOn": "forfalt",
|
||||
"inProject": "fra prosjekt",
|
||||
"lowPriority": "lav prioritet",
|
||||
"mediumPriority": "moderat prioritet",
|
||||
"highPriority": "høy prioritet",
|
||||
"inDays": "om {{count}} dager",
|
||||
"daysAgo": "{{count}} dager siden",
|
||||
"tagsUpdated": "Merker oppdatert med suksess",
|
||||
"tagsUpdateError": "Kunne ikke oppdatere tagger",
|
||||
"recurrenceUpdated": "Gjentakelse oppdatert",
|
||||
"recurrenceUpdateError": "Kunne ikke oppdatere gjentakelse",
|
||||
"dueDateUpdated": "Forfallsdato oppdatert",
|
||||
"dueDateUpdateError": "Kunne ikke oppdatere forfallsdato",
|
||||
"titleUpdated": "Oppgave tittel oppdatert",
|
||||
"titleUpdateError": "Kunne ikke oppdatere oppgave tittel",
|
||||
"contentUpdated": "Oppgaveinnhold oppdatert",
|
||||
"contentUpdateError": "Kunne ikke oppdatere oppgaveinnhold",
|
||||
"subtasksUpdated": "Undertasker oppdatert",
|
||||
"subtasksUpdateError": "Kunne ikke oppdatere undertasker",
|
||||
"projectUpdated": "Prosjekt oppdatert",
|
||||
"projectUpdateError": "Kunne ikke oppdatere prosjekt",
|
||||
"projectCleared": "Prosjektet er ryddet",
|
||||
"projectClearError": "Kunne ikke rydde prosjekt",
|
||||
"priorityUpdated": "Prioritet oppdatert",
|
||||
"priorityUpdateError": "Kunne ikke oppdatere prioritet",
|
||||
"status": {
|
||||
"notStarted": "ikke startet",
|
||||
"inProgress": "pågår",
|
||||
"done": "fullført",
|
||||
"archived": "arkivert",
|
||||
"unknown": "pågående"
|
||||
},
|
||||
"noSubtasksClickToAdd": "Ingen deloppgaver ennå, klikk for å legge til",
|
||||
"noProject": "Ingen prosjekt - Klikk for å tildele",
|
||||
"noTags": "Ingen etiketter",
|
||||
"noDueDate": "Ingen forfallsdato",
|
||||
"notRecurring": "Denne oppgaven er ikke gjentakende ennå.",
|
||||
"clickToEditTitle": "Klikk for å redigere tittel",
|
||||
"clickToEditContent": "Klikk for å redigere innhold",
|
||||
"clickToAddContent": "Klikk for å legge til innhold",
|
||||
"clickToEditSubtasks": "Klikk for å redigere deloppgaver",
|
||||
"clickToAddOrEditSubtasks": "Klikk for å legge til eller redigere deloppgaver",
|
||||
"contentPlaceholder": "Legg til innhold her... (Markdown støttet)",
|
||||
"contentEditHint": "Trykk Cmd/Ctrl+Enter for å lagre, Esc for å avbryte",
|
||||
"noContentPreview": "Ingen innhold å forhåndsvise. Bytt til Rediger modus for å legge til innhold.",
|
||||
"deleteConfirmTitle": "Slett oppgave",
|
||||
"deleteConfirmMessage": "Er du sikker på at du vil slette denne oppgaven? Denne handlingen kan ikke angres.",
|
||||
"noMoreIterations": "Ingen flere iterasjoner planlagt",
|
||||
"nextOccurrences": "Neste forekomster",
|
||||
"nextOccurrencesAfterThis": "Neste forekomster etter dette",
|
||||
"instanceOf": "Dette er en instans av en gjentakende oppgave",
|
||||
"parentTask": "Foreldrepågave",
|
||||
"includingToday": "inkludert i dag",
|
||||
"has": "har",
|
||||
"fromProject": "fra prosjektet"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Laster prosjekter...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "ikke-gjentakende",
|
||||
"instances": "gjentakende instanser"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Legg til en underoppgave..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Data zakończenia powtarzania została zmieniona",
|
||||
"recurrenceEndDate": "Data zakończenia powtarzania",
|
||||
"recurrence_type_changed": "Typ powtarzania zmieniony",
|
||||
"recurrence_interval_changed": "Interwał powtarzania zmieniony"
|
||||
"recurrence_interval_changed": "Interwał powtarzania zmieniony",
|
||||
"completionBasedChanged": "Zmiana opartej na ukończeniu powtarzalności",
|
||||
"projectIdChanged": "Przypisano do projektu",
|
||||
"recurrenceType": "Typ powtarzalności",
|
||||
"recurrenceTypeChanged": "Zmiana typu powtarzalności"
|
||||
},
|
||||
"justNow": "Właśnie teraz",
|
||||
"minutesAgo": "{{minutes}}m temu",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Dzień miesiąca",
|
||||
"weekOfMonth": "Tydzień miesiąca",
|
||||
"recurrenceEndDate": "Data zakończenia (opcjonalnie)",
|
||||
"completionBased": "Powtórz po zakończeniu"
|
||||
"completionBased": "Powtórz po zakończeniu",
|
||||
"repeatOn": "Powtarzaj w"
|
||||
},
|
||||
"projectSearchPlaceholder": "Szukaj lub utwórz projekt...",
|
||||
"noMatchingProjects": "Brak pasujących projektów",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Spróbuj być bardziej konkretny w tym, co należy zrobić",
|
||||
"noVerb": "Jaką konkretną czynność musisz wykonać? Spróbuj zacząć od czasownika.",
|
||||
"vague": "Spróbuj zacząć od czasownika akcji, takiego jak \"Zadzwoń\", \"Napisz\", \"Zaplanuj\" lub \"Zbadaj\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Proszę wybrać przynajmniej jeden dzień"
|
||||
},
|
||||
"noteTitle": "Tytuł notatki",
|
||||
"noteContent": "Treść notatki",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Przeglądaj obraz",
|
||||
"noNotes": "Brak notatek dla tego projektu.",
|
||||
"deleteProject": "Usuń projekt",
|
||||
"createSuccess": "Projekt został pomyślnie utworzony!"
|
||||
"createSuccess": "Projekt został pomyślnie utworzony!",
|
||||
"createdAndAssigned": "Projekt utworzony i przypisany",
|
||||
"createError": "Nie udało się utworzyć projektu",
|
||||
"viewProject": "Przejdź do projektu"
|
||||
},
|
||||
"errors": {
|
||||
"required": "To pole jest wymagane",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Podzadania",
|
||||
"noSubtasks": "Brak podzadań",
|
||||
"recentActivity": "Ostatnia aktywność",
|
||||
"noActivityYet": "Brak aktywności jeszcze"
|
||||
"noActivityYet": "Brak aktywności jeszcze",
|
||||
"project": "Projekt",
|
||||
"noProject": "Brak projektu - Kliknij, aby przypisać",
|
||||
"tags": "Tagi",
|
||||
"noTags": "Brak tagów",
|
||||
"priority": "Priorytet",
|
||||
"dueDate": "Termin",
|
||||
"recurringSetup": "Ustawienia powtarzalności",
|
||||
"notRecurring": "To zadanie jeszcze nie jest powtarzalne.",
|
||||
"clickToEditTitle": "Kliknij, aby edytować tytuł",
|
||||
"clickToEditContent": "Kliknij, aby edytować treść",
|
||||
"clickToAddContent": "Kliknij, aby dodać treść",
|
||||
"clickToEditSubtasks": "Kliknij, aby edytować podzadania",
|
||||
"clickToAddOrEditSubtasks": "Kliknij, aby dodać lub edytować podzadania",
|
||||
"contentPlaceholder": "Dodaj treść tutaj... (obsługuje Markdown)",
|
||||
"contentEditHint": "Naciśnij Cmd/Ctrl+Enter, aby zapisać, Esc, aby anulować",
|
||||
"noContentPreview": "Brak treści do podglądu. Przełącz się na tryb edycji, aby dodać treść.",
|
||||
"deleteConfirmTitle": "Usuń zadanie",
|
||||
"deleteConfirmMessage": "Czy na pewno chcesz usunąć to zadanie? Ta akcja nie może być cofnięta.",
|
||||
"noMoreIterations": "Brak zaplanowanych iteracji",
|
||||
"nextOccurrences": "Następne wystąpienia",
|
||||
"nextOccurrencesAfterThis": "Następne wystąpienia po tym",
|
||||
"thisTask": "To zadanie",
|
||||
"is": "jest",
|
||||
"and": "i",
|
||||
"dueOn": "należy",
|
||||
"inProject": "z projektu",
|
||||
"lowPriority": "niski priorytet",
|
||||
"mediumPriority": "średni priorytet",
|
||||
"highPriority": "wysoki priorytet",
|
||||
"inDays": "za {{count}} dni",
|
||||
"daysAgo": "{{count}} dni temu",
|
||||
"tagsUpdated": "Tagi zaktualizowane pomyślnie",
|
||||
"tagsUpdateError": "Nie udało się zaktualizować tagów",
|
||||
"recurrenceUpdated": "Powtarzalność zaktualizowana pomyślnie",
|
||||
"recurrenceUpdateError": "Nie udało się zaktualizować powtarzalności",
|
||||
"dueDateUpdated": "Termin zaktualizowany pomyślnie",
|
||||
"dueDateUpdateError": "Nie udało się zaktualizować daty wykonania",
|
||||
"titleUpdated": "Tytuł zadania zaktualizowany pomyślnie",
|
||||
"titleUpdateError": "Nie udało się zaktualizować tytułu zadania",
|
||||
"contentUpdated": "Treść zadania zaktualizowana pomyślnie",
|
||||
"contentUpdateError": "Nie udało się zaktualizować treści zadania",
|
||||
"subtasksUpdated": "Podzadania zaktualizowane pomyślnie",
|
||||
"subtasksUpdateError": "Nie udało się zaktualizować podzadań",
|
||||
"projectUpdated": "Projekt zaktualizowany pomyślnie",
|
||||
"projectUpdateError": "Nie udało się zaktualizować projektu",
|
||||
"projectCleared": "Projekt usunięty pomyślnie",
|
||||
"projectClearError": "Nie udało się usunąć projektu",
|
||||
"priorityUpdated": "Priorytet zaktualizowany pomyślnie",
|
||||
"priorityUpdateError": "Nie udało się zaktualizować priorytetu",
|
||||
"status": {
|
||||
"notStarted": "nie rozpoczęto",
|
||||
"inProgress": "w trakcie",
|
||||
"done": "ukończone",
|
||||
"archived": "zarchiwizowane",
|
||||
"unknown": "w toku"
|
||||
},
|
||||
"noSubtasksClickToAdd": "Brak podzadań, kliknij, aby dodać",
|
||||
"noDueDate": "Brak daty wykonania",
|
||||
"instanceOf": "To jest instancja zadania cyklicznego",
|
||||
"parentTask": "Zadanie nadrzędne",
|
||||
"includingToday": "w tym dzisiaj",
|
||||
"has": "ma",
|
||||
"fromProject": "z projektu"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Ładowanie projektów...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "niepowtarzające się",
|
||||
"instances": "powtarzające się instancje"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Dodaj podzadanie..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Data de término da recorrência alterada",
|
||||
"recurrenceEndDate": "Data de término da recorrência",
|
||||
"recurrence_type_changed": "Tipo de recorrência alterado",
|
||||
"recurrence_interval_changed": "Intervalo de recorrência alterado"
|
||||
"recurrence_interval_changed": "Intervalo de recorrência alterado",
|
||||
"completionBasedChanged": "Recorrência baseada em conclusão alterada",
|
||||
"projectIdChanged": "Atribuído a um projeto",
|
||||
"recurrenceType": "Tipo de recorrência",
|
||||
"recurrenceTypeChanged": "Tipo de recorrência alterado"
|
||||
},
|
||||
"justNow": "Agora mesmo",
|
||||
"minutesAgo": "{{minutes}}m atrás",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Dia do mês",
|
||||
"weekOfMonth": "Semana do mês",
|
||||
"recurrenceEndDate": "Data de término (opcional)",
|
||||
"completionBased": "Repetir após conclusão"
|
||||
"completionBased": "Repetir após conclusão",
|
||||
"repeatOn": "Repetir em"
|
||||
},
|
||||
"projectSearchPlaceholder": "Pesquisar ou criar um projeto...",
|
||||
"noMatchingProjects": "Nenhum projeto correspondente",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Tente ser mais específico sobre o que precisa ser feito",
|
||||
"noVerb": "Qual ação específica você precisa realizar? Tente começar com um verbo.",
|
||||
"vague": "Tente começar com um verbo de ação como \"Ligar\", \"Escrever\", \"Agendar\" ou \"Pesquisar\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Por favor, selecione pelo menos um dia"
|
||||
},
|
||||
"noteTitle": "Título da Nota",
|
||||
"noteContent": "Conteúdo da Nota",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Procurar Imagem",
|
||||
"noNotes": "Nenhuma nota para este projeto.",
|
||||
"deleteProject": "Excluir Projeto",
|
||||
"createSuccess": "Projeto criado com sucesso!"
|
||||
"createSuccess": "Projeto criado com sucesso!",
|
||||
"createdAndAssigned": "Projeto criado e atribuído",
|
||||
"createError": "Falha ao criar projeto",
|
||||
"viewProject": "Ir para o projeto"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Este campo é obrigatório",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Subtarefas",
|
||||
"noSubtasks": "Nenhuma subtarefa ainda",
|
||||
"recentActivity": "Atividade Recente",
|
||||
"noActivityYet": "Nenhuma atividade ainda"
|
||||
"noActivityYet": "Nenhuma atividade ainda",
|
||||
"project": "Projeto",
|
||||
"noProject": "Nenhum projeto - Clique para atribuir",
|
||||
"tags": "Tags",
|
||||
"noTags": "Sem tags",
|
||||
"priority": "Prioridade",
|
||||
"dueDate": "Data de Vencimento",
|
||||
"recurringSetup": "Configuração Recorrente",
|
||||
"notRecurring": "Esta tarefa ainda não é recorrente.",
|
||||
"clickToEditTitle": "Clique para editar o título",
|
||||
"clickToEditContent": "Clique para editar o conteúdo",
|
||||
"clickToAddContent": "Clique para adicionar conteúdo",
|
||||
"clickToEditSubtasks": "Clique para editar subtarefas",
|
||||
"clickToAddOrEditSubtasks": "Clique para adicionar ou editar subtarefas",
|
||||
"contentPlaceholder": "Adicione conteúdo aqui... (Markdown suportado)",
|
||||
"contentEditHint": "Pressione Cmd/Ctrl+Enter para salvar, Esc para cancelar",
|
||||
"noContentPreview": "Nenhum conteúdo para visualizar. Mude para o modo Editar para adicionar conteúdo.",
|
||||
"deleteConfirmTitle": "Excluir Tarefa",
|
||||
"deleteConfirmMessage": "Você tem certeza de que deseja excluir esta tarefa? Esta ação não pode ser desfeita.",
|
||||
"noMoreIterations": "Nenhuma iteração agendada",
|
||||
"nextOccurrences": "Próximas Ocorrências",
|
||||
"nextOccurrencesAfterThis": "Próximas Ocorrências Após Esta",
|
||||
"thisTask": "Esta tarefa",
|
||||
"is": "é",
|
||||
"and": "e",
|
||||
"dueOn": "vencido",
|
||||
"inProject": "do projeto",
|
||||
"lowPriority": "baixa prioridade",
|
||||
"mediumPriority": "prioridade média",
|
||||
"highPriority": "alta prioridade",
|
||||
"inDays": "em {{count}} dias",
|
||||
"daysAgo": "{{count}} dias atrás",
|
||||
"tagsUpdated": "Tags atualizadas com sucesso",
|
||||
"tagsUpdateError": "Falha ao atualizar tags",
|
||||
"recurrenceUpdated": "Recorrência atualizada com sucesso",
|
||||
"recurrenceUpdateError": "Falha ao atualizar a recorrência",
|
||||
"dueDateUpdated": "Data de vencimento atualizada com sucesso",
|
||||
"dueDateUpdateError": "Falha ao atualizar a data de vencimento",
|
||||
"titleUpdated": "Título da tarefa atualizado com sucesso",
|
||||
"titleUpdateError": "Falha ao atualizar o título da tarefa",
|
||||
"contentUpdated": "Conteúdo da tarefa atualizado com sucesso",
|
||||
"contentUpdateError": "Falha ao atualizar o conteúdo da tarefa",
|
||||
"subtasksUpdated": "Subtarefas atualizadas com sucesso",
|
||||
"subtasksUpdateError": "Falha ao atualizar as subtarefas",
|
||||
"projectUpdated": "Projeto atualizado com sucesso",
|
||||
"projectUpdateError": "Falha ao atualizar o projeto",
|
||||
"projectCleared": "Projeto limpo com sucesso",
|
||||
"projectClearError": "Falha ao limpar o projeto",
|
||||
"priorityUpdated": "Prioridade atualizada com sucesso",
|
||||
"priorityUpdateError": "Falha ao atualizar a prioridade",
|
||||
"status": {
|
||||
"notStarted": "não iniciado",
|
||||
"inProgress": "em progresso",
|
||||
"done": "completo",
|
||||
"archived": "arquivado",
|
||||
"unknown": "em andamento"
|
||||
},
|
||||
"noSubtasksClickToAdd": "Nenhuma subtarefa ainda, clique para adicionar",
|
||||
"noDueDate": "Sem data de vencimento",
|
||||
"instanceOf": "Esta é uma instância de uma tarefa recorrente",
|
||||
"parentTask": "Tarefa Pai",
|
||||
"includingToday": "incluindo hoje",
|
||||
"has": "tem",
|
||||
"fromProject": "do projeto"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Carregando projetos...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "não recorrente",
|
||||
"instances": "instâncias recorrentes"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Adicionar uma subtarefa..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Data de încheiere a recurenței a fost modificată",
|
||||
"recurrenceEndDate": "Data de încheiere a recurenței",
|
||||
"recurrence_type_changed": "Tipul de recurență s-a schimbat",
|
||||
"recurrence_interval_changed": "Intervalul de recurență s-a schimbat"
|
||||
"recurrence_interval_changed": "Intervalul de recurență s-a schimbat",
|
||||
"completionBasedChanged": "Recurrence bazată pe finalizare modificată",
|
||||
"projectIdChanged": "Atribuit unui proiect",
|
||||
"recurrenceType": "Tip de recurență",
|
||||
"recurrenceTypeChanged": "Tip de recurență modificat"
|
||||
},
|
||||
"justNow": "Chiar acum",
|
||||
"minutesAgo": "{{minutes}}m în urmă",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Ziua lunii",
|
||||
"weekOfMonth": "Săptămâna lunii",
|
||||
"recurrenceEndDate": "Data de sfârșit (opțional)",
|
||||
"completionBased": "Repetare după finalizare"
|
||||
"completionBased": "Repetare după finalizare",
|
||||
"repeatOn": "Repetă pe"
|
||||
},
|
||||
"projectSearchPlaceholder": "Caută sau creează un proiect...",
|
||||
"noMatchingProjects": "Niciun proiect corespunzător",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Încercați să fiți mai specifici cu privire la ceea ce trebuie făcut",
|
||||
"noVerb": "Ce acțiune specifică trebuie să întreprinzi? Încercați să începeți cu un verb.",
|
||||
"vague": "Încercați să începeți cu un verb de acțiune, cum ar fi \"Sună\", \"Scrie\", \"Programează\" sau \"Cercetează\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Te rugăm să selectezi cel puțin o zi"
|
||||
},
|
||||
"noteTitle": "Titlul notei",
|
||||
"noteContent": "Conținutul notei",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Răsfoiți Imaginea",
|
||||
"noNotes": "Nu există note pentru acest proiect.",
|
||||
"deleteProject": "Șterge Proiectul",
|
||||
"createSuccess": "Proiect creat cu succes!"
|
||||
"createSuccess": "Proiect creat cu succes!",
|
||||
"createdAndAssigned": "Proiect creat și atribuit",
|
||||
"createError": "Crearea proiectului a eșuat",
|
||||
"viewProject": "Accesează proiectul"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Acest câmp este obligatoriu",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Subsarci",
|
||||
"noSubtasks": "Nu există subsarci încă",
|
||||
"recentActivity": "Activitate recentă",
|
||||
"noActivityYet": "Nicio activitate încă"
|
||||
"noActivityYet": "Nicio activitate încă",
|
||||
"project": "Proiect",
|
||||
"noProject": "Niciun proiect - Fă clic pentru a atribui",
|
||||
"tags": "Etichete",
|
||||
"noTags": "Niciună etichetă",
|
||||
"priority": "Prioritate",
|
||||
"dueDate": "Data limită",
|
||||
"recurringSetup": "Configurare recurentă",
|
||||
"notRecurring": "Această sarcină nu este încă recurentă.",
|
||||
"clickToEditTitle": "Fă clic pentru a edita titlul",
|
||||
"clickToEditContent": "Fă clic pentru a edita conținutul",
|
||||
"clickToAddContent": "Fă clic pentru a adăuga conținut",
|
||||
"clickToEditSubtasks": "Fă clic pentru a edita subtasks",
|
||||
"clickToAddOrEditSubtasks": "Fă clic pentru a adăuga sau edita subtasks",
|
||||
"contentPlaceholder": "Adăugați conținut aici... (Markdown acceptat)",
|
||||
"contentEditHint": "Apăsați Cmd/Ctrl+Enter pentru a salva, Esc pentru a anula",
|
||||
"noContentPreview": "Nu există conținut de previzualizat. Schimbați în modul Editare pentru a adăuga conținut.",
|
||||
"deleteConfirmTitle": "Ștergeți Sarcina",
|
||||
"deleteConfirmMessage": "Sunteți sigur că doriți să ștergeți această sarcină? Această acțiune nu poate fi anulată.",
|
||||
"noMoreIterations": "Nu mai sunt programate iterații",
|
||||
"nextOccurrences": "Următoarele Apariții",
|
||||
"nextOccurrencesAfterThis": "Următoarele Apariții După Aceasta",
|
||||
"thisTask": "Această sarcină",
|
||||
"is": "este",
|
||||
"and": "și",
|
||||
"dueOn": "scadent",
|
||||
"inProject": "din proiect",
|
||||
"lowPriority": "prioritate scăzută",
|
||||
"mediumPriority": "prioritate medie",
|
||||
"highPriority": "prioritate ridicată",
|
||||
"inDays": "în {{count}} zile",
|
||||
"daysAgo": "{{count}} zile în urmă",
|
||||
"tagsUpdated": "Etichetele au fost actualizate cu succes",
|
||||
"tagsUpdateError": "Actualizarea etichetelor a eșuat",
|
||||
"recurrenceUpdated": "Recurența actualizată cu succes",
|
||||
"recurrenceUpdateError": "Eșec la actualizarea recurenței",
|
||||
"dueDateUpdated": "Data limită actualizată cu succes",
|
||||
"dueDateUpdateError": "Eșec la actualizarea datei limită",
|
||||
"titleUpdated": "Titlul sarcinii actualizat cu succes",
|
||||
"titleUpdateError": "Eșec la actualizarea titlului sarcinii",
|
||||
"contentUpdated": "Conținutul sarcinii actualizat cu succes",
|
||||
"contentUpdateError": "Eșec la actualizarea conținutului sarcinii",
|
||||
"subtasksUpdated": "Subtask-urile actualizate cu succes",
|
||||
"subtasksUpdateError": "Eșec la actualizarea subtask-urilor",
|
||||
"projectUpdated": "Proiectul actualizat cu succes",
|
||||
"projectUpdateError": "Eșec la actualizarea proiectului",
|
||||
"projectCleared": "Proiectul șters cu succes",
|
||||
"projectClearError": "Eșec la ștergerea proiectului",
|
||||
"priorityUpdated": "Prioritatea actualizată cu succes",
|
||||
"priorityUpdateError": "Eșec la actualizarea priorității",
|
||||
"status": {
|
||||
"notStarted": "neînceput",
|
||||
"inProgress": "în desfășurare",
|
||||
"done": "finalizat",
|
||||
"archived": "archivat",
|
||||
"unknown": "în desfășurare"
|
||||
},
|
||||
"noSubtasksClickToAdd": "Nu există subtasks încă, dă click pentru a adăuga",
|
||||
"noDueDate": "Fără dată limită",
|
||||
"instanceOf": "Aceasta este o instanță a unei sarcini recurente",
|
||||
"parentTask": "Sarcina Părinte",
|
||||
"includingToday": "inclusiv astăzi",
|
||||
"has": "are",
|
||||
"fromProject": "din proiect"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Se încarcă proiectele...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "non-recurent",
|
||||
"instances": "instanțe recurente"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Adaugă o subtask..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Дата окончания повторения изменена",
|
||||
"recurrenceEndDate": "Дата окончания повторения",
|
||||
"recurrence_type_changed": "Тип повторения изменен",
|
||||
"recurrence_interval_changed": "Интервал повторения изменен"
|
||||
"recurrence_interval_changed": "Интервал повторения изменен",
|
||||
"completionBasedChanged": "Изменено основанное на завершении повторение",
|
||||
"projectIdChanged": "Назначено проекту",
|
||||
"recurrenceType": "Тип повторения",
|
||||
"recurrenceTypeChanged": "Тип повторения изменен"
|
||||
},
|
||||
"justNow": "Только что",
|
||||
"minutesAgo": "{{minutes}}м назад",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "День месяца",
|
||||
"weekOfMonth": "Неделя месяца",
|
||||
"recurrenceEndDate": "Дата окончания (необязательно)",
|
||||
"completionBased": "Повторять после завершения"
|
||||
"completionBased": "Повторять после завершения",
|
||||
"repeatOn": "Повторять в"
|
||||
},
|
||||
"projectSearchPlaceholder": "Поиск или создание проекта...",
|
||||
"noMatchingProjects": "Нет подходящих проектов",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Попробуйте быть более конкретными относительно того, что нужно сделать",
|
||||
"noVerb": "Какое конкретное действие вам нужно предпринять? Попробуйте начать с глагола.",
|
||||
"vague": "Попробуйте начать с глагола действия, например, \"Позвонить\", \"Написать\", \"Запланировать\" или \"Исследовать\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Пожалуйста, выберите хотя бы один день"
|
||||
},
|
||||
"noteTitle": "Название заметки",
|
||||
"noteContent": "Содержание заметки",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Выбрать изображение",
|
||||
"noNotes": "Нет заметок для этого проекта.",
|
||||
"deleteProject": "Удалить проект",
|
||||
"createSuccess": "Проект успешно создан!"
|
||||
"createSuccess": "Проект успешно создан!",
|
||||
"createdAndAssigned": "Проект создан и назначен",
|
||||
"createError": "Не удалось создать проект",
|
||||
"viewProject": "Перейти к проекту"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Это поле обязательно для заполнения",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Подзадачи",
|
||||
"noSubtasks": "Подзадач пока нет",
|
||||
"recentActivity": "Недавняя активность",
|
||||
"noActivityYet": "Пока нет активности"
|
||||
"noActivityYet": "Пока нет активности",
|
||||
"noSubtasksClickToAdd": "Нет подзадач, нажмите, чтобы добавить",
|
||||
"project": "Проект",
|
||||
"noProject": "Нет проекта - Нажмите, чтобы назначить",
|
||||
"tags": "Теги",
|
||||
"noTags": "Нет тегов",
|
||||
"priority": "Приоритет",
|
||||
"dueDate": "Срок выполнения",
|
||||
"recurringSetup": "Настройка повторения",
|
||||
"notRecurring": "Эта задача пока не является повторяющейся.",
|
||||
"clickToEditTitle": "Нажмите, чтобы редактировать заголовок",
|
||||
"clickToEditContent": "Нажмите, чтобы редактировать содержимое",
|
||||
"clickToAddContent": "Нажмите, чтобы добавить контент",
|
||||
"clickToEditSubtasks": "Нажмите, чтобы редактировать подзадачи",
|
||||
"clickToAddOrEditSubtasks": "Нажмите, чтобы добавить или редактировать подзадачи",
|
||||
"contentPlaceholder": "Добавьте контент здесь... (поддерживается Markdown)",
|
||||
"contentEditHint": "Нажмите Cmd/Ctrl+Enter, чтобы сохранить, Esc, чтобы отменить",
|
||||
"noContentPreview": "Нет контента для предварительного просмотра. Переключитесь в режим редактирования, чтобы добавить контент.",
|
||||
"deleteConfirmTitle": "Удалить задачу",
|
||||
"deleteConfirmMessage": "Вы уверены, что хотите удалить эту задачу? Это действие нельзя отменить.",
|
||||
"noMoreIterations": "Больше итераций не запланировано",
|
||||
"nextOccurrences": "Следующие события",
|
||||
"nextOccurrencesAfterThis": "Следующие события после этого",
|
||||
"thisTask": "Эта задача",
|
||||
"is": "является",
|
||||
"and": "и",
|
||||
"dueOn": "срок",
|
||||
"inProject": "из проекта",
|
||||
"lowPriority": "низкий приоритет",
|
||||
"mediumPriority": "средний приоритет",
|
||||
"highPriority": "высокий приоритет",
|
||||
"inDays": "через {{count}} дней",
|
||||
"daysAgo": "{{count}} дней назад",
|
||||
"tagsUpdated": "Теги успешно обновлены",
|
||||
"tagsUpdateError": "Не удалось обновить теги",
|
||||
"recurrenceUpdated": "Повторение успешно обновлено",
|
||||
"recurrenceUpdateError": "Не удалось обновить повторение",
|
||||
"dueDateUpdated": "Срок выполнения успешно обновлен",
|
||||
"dueDateUpdateError": "Не удалось обновить срок выполнения",
|
||||
"titleUpdated": "Название задачи успешно обновлено",
|
||||
"titleUpdateError": "Не удалось обновить название задачи",
|
||||
"contentUpdated": "Содержимое задачи успешно обновлено",
|
||||
"contentUpdateError": "Не удалось обновить содержимое задачи",
|
||||
"subtasksUpdated": "Подзадачи успешно обновлены",
|
||||
"subtasksUpdateError": "Не удалось обновить подзадачи",
|
||||
"projectUpdated": "Проект успешно обновлен",
|
||||
"projectUpdateError": "Не удалось обновить проект",
|
||||
"projectCleared": "Проект успешно очищен",
|
||||
"projectClearError": "Не удалось очистить проект",
|
||||
"priorityUpdated": "Приоритет успешно обновлен",
|
||||
"priorityUpdateError": "Не удалось обновить приоритет",
|
||||
"status": {
|
||||
"notStarted": "не начато",
|
||||
"inProgress": "в процессе",
|
||||
"done": "завершено",
|
||||
"archived": "архивировано",
|
||||
"unknown": "в процессе"
|
||||
},
|
||||
"noDueDate": "Нет срока выполнения",
|
||||
"instanceOf": "Это экземпляр повторяющейся задачи",
|
||||
"parentTask": "Родительская задача",
|
||||
"includingToday": "включая сегодня",
|
||||
"has": "имеет",
|
||||
"fromProject": "из проекта"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Загрузка проектов...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "неповторяющийся",
|
||||
"instances": "повторяющиеся экземпляры"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Добавить подзадачу..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -156,7 +156,11 @@
|
|||
"recurrenceEndDateChanged": "Datum konca ponavljanja se je spremenil",
|
||||
"recurrenceEndDate": "Datum konca ponavljanja",
|
||||
"recurrence_type_changed": "Vrsta ponavljanja se je spremenila",
|
||||
"recurrence_interval_changed": "Interval ponavljanja se je spremenil"
|
||||
"recurrence_interval_changed": "Interval ponavljanja se je spremenil",
|
||||
"completionBasedChanged": "Sprememba ponavljanja na podlagi dokončanja",
|
||||
"projectIdChanged": "Dodeljeno projektu",
|
||||
"recurrenceType": "Vrsta ponavljanja",
|
||||
"recurrenceTypeChanged": "Vrsta ponavljanja spremenjena"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Dan v mesecu",
|
||||
"weekOfMonth": "Teden v mesecu",
|
||||
"recurrenceEndDate": "Datum konca (neobvezno)",
|
||||
"completionBased": "Ponovi po zaključku"
|
||||
"completionBased": "Ponovi po zaključku",
|
||||
"repeatOn": "Ponovi na"
|
||||
},
|
||||
"projectSearchPlaceholder": "Išči ali ustvari projekt...",
|
||||
"noMatchingProjects": "Brez ustreznih projektov",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Poskusite biti bolj specifični glede tega, kaj je treba narediti",
|
||||
"noVerb": "Katero specifično dejanje morate izvesti? Poskusite začeti z glagolom.",
|
||||
"vague": "Poskusite začeti z glagolom akcije, kot so \"Pokliči\", \"Napiši\", \"Načrtuj\" ali \"Raziskuj\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Prosimo, izberite vsaj en dan"
|
||||
},
|
||||
"noteTitle": "Naslov opombe",
|
||||
"noteContent": "Vsebina opombe",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Prebrskaj sliko",
|
||||
"noNotes": "Ni opomb za ta projekt.",
|
||||
"deleteProject": "Izbriši projekt",
|
||||
"createSuccess": "Projekt uspešno ustvarjen!"
|
||||
"createSuccess": "Projekt uspešno ustvarjen!",
|
||||
"createdAndAssigned": "Projekt ustvarjen in dodeljen",
|
||||
"createError": "Ustvarjanje projekta ni uspelo",
|
||||
"viewProject": "Pojdi na projekt"
|
||||
},
|
||||
"errors": {
|
||||
"required": "To polje je obvezno",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Podnaloge",
|
||||
"noSubtasks": "Še ni podnalog",
|
||||
"recentActivity": "Nedavna dejavnost",
|
||||
"noActivityYet": "Še ni dejavnosti"
|
||||
"noActivityYet": "Še ni dejavnosti",
|
||||
"noSubtasksClickToAdd": "Še ni podnalog, kliknite za dodajanje",
|
||||
"project": "Projekt",
|
||||
"noProject": "Brez projekta - Kliknite za dodelitev",
|
||||
"tags": "Oznake",
|
||||
"noTags": "Brez oznak",
|
||||
"priority": "Prioriteta",
|
||||
"dueDate": "Rok",
|
||||
"recurringSetup": "Nastavitev ponavljanja",
|
||||
"notRecurring": "Ta naloga še ni ponavljajoča.",
|
||||
"clickToEditTitle": "Kliknite za urejanje naslova",
|
||||
"clickToEditContent": "Kliknite za urejanje vsebine",
|
||||
"clickToAddContent": "Kliknite za dodajanje vsebine",
|
||||
"clickToEditSubtasks": "Kliknite za urejanje podnalog",
|
||||
"clickToAddOrEditSubtasks": "Kliknite za dodajanje ali urejanje podnalog",
|
||||
"contentPlaceholder": "Dodajte vsebino tukaj... (podpora za Markdown)",
|
||||
"contentEditHint": "Pritisnite Cmd/Ctrl+Enter za shranjevanje, Esc za preklic",
|
||||
"noContentPreview": "Brez vsebine za predogled. Preklopite v način urejanja za dodajanje vsebine.",
|
||||
"deleteConfirmTitle": "Izbriši nalogo",
|
||||
"deleteConfirmMessage": "Ali ste prepričani, da želite izbrisati to nalogo? Te akcije ni mogoče razveljaviti.",
|
||||
"noMoreIterations": "Ni več načrtovanih ponovitev",
|
||||
"nextOccurrences": "Naslednji dogodki",
|
||||
"nextOccurrencesAfterThis": "Naslednji dogodki po tem",
|
||||
"thisTask": "Ta naloga",
|
||||
"is": "je",
|
||||
"and": "in",
|
||||
"dueOn": "rok",
|
||||
"inProject": "iz projekta",
|
||||
"lowPriority": "nizka prioriteta",
|
||||
"mediumPriority": "srednja prioriteta",
|
||||
"highPriority": "visoka prioriteta",
|
||||
"inDays": "v {{count}} dneh",
|
||||
"daysAgo": "{{count}} dni nazaj",
|
||||
"tagsUpdated": "Oznake so bile uspešno posodobljene",
|
||||
"tagsUpdateError": "Posodobitev oznak je bila neuspešna",
|
||||
"recurrenceUpdated": "Ponovitev je bila uspešno posodobljena",
|
||||
"recurrenceUpdateError": "Posodobitev ponovitve je bila neuspešna",
|
||||
"dueDateUpdated": "Rok je bil uspešno posodobljen",
|
||||
"dueDateUpdateError": "Posodobitev roka je bila neuspešna",
|
||||
"titleUpdated": "Naslov naloge je bil uspešno posodobljen",
|
||||
"titleUpdateError": "Posodobitev naslova naloge je bila neuspešna",
|
||||
"contentUpdated": "Vsebina naloge je bila uspešno posodobljena",
|
||||
"contentUpdateError": "Posodobitev vsebine naloge je bila neuspešna",
|
||||
"subtasksUpdated": "Podnaloge so bile uspešno posodobljene",
|
||||
"subtasksUpdateError": "Posodobitev podnalog je bila neuspešna",
|
||||
"projectUpdated": "Projekt je bil uspešno posodobljen",
|
||||
"projectUpdateError": "Posodobitev projekta je bila neuspešna",
|
||||
"projectCleared": "Projekt je bil uspešno očiščen",
|
||||
"projectClearError": "Čiščenje projekta je bilo neuspešno",
|
||||
"priorityUpdated": "Prioriteta je bila uspešno posodobljena",
|
||||
"priorityUpdateError": "Posodobitev prioritete je bila neuspešna",
|
||||
"status": {
|
||||
"notStarted": "ni začeto",
|
||||
"inProgress": "v teku",
|
||||
"done": "zaključeno",
|
||||
"archived": "arhivirano",
|
||||
"unknown": "poteka"
|
||||
},
|
||||
"noDueDate": "Brez roka",
|
||||
"instanceOf": "To je instanca ponavljajoče se naloge",
|
||||
"parentTask": "Nadrejena naloga",
|
||||
"includingToday": "vključno s danes",
|
||||
"has": "ima",
|
||||
"fromProject": "iz projekta"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Nalagam projekte...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "neponavljajoče se",
|
||||
"instances": "ponavljajoče se instance"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Dodaj podnalogo..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -156,7 +156,11 @@
|
|||
"recurrenceEndDateChanged": "Återkommande slutdatum ändrat",
|
||||
"recurrenceEndDate": "Återkommande slutdatum",
|
||||
"recurrence_type_changed": "Återkommande typ ändrad",
|
||||
"recurrence_interval_changed": "Återkommande intervall ändrat"
|
||||
"recurrence_interval_changed": "Återkommande intervall ändrat",
|
||||
"completionBasedChanged": "Ändrad återkommande baserat på slutförande",
|
||||
"projectIdChanged": "Tilldelad ett projekt",
|
||||
"recurrenceType": "Typ av återkommande",
|
||||
"recurrenceTypeChanged": "Typ av återkommande ändrad"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Dag i månaden",
|
||||
"weekOfMonth": "Vecka i månaden",
|
||||
"recurrenceEndDate": "Slutdatum (valfritt)",
|
||||
"completionBased": "Upprepa efter slutförd"
|
||||
"completionBased": "Upprepa efter slutförd",
|
||||
"repeatOn": "Upprepa på"
|
||||
},
|
||||
"projectSearchPlaceholder": "Sök eller skapa ett projekt...",
|
||||
"noMatchingProjects": "Inga matchande projekt",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Försök att vara mer specifik om vad som behöver göras",
|
||||
"noVerb": "Vilken specifik åtgärd behöver du vidta? Försök att börja med ett verb.",
|
||||
"vague": "Försök att börja med ett handlingsverb som \"Ring\", \"Skriv\", \"Boka\" eller \"Forska\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Vänligen välj minst en dag"
|
||||
},
|
||||
"noteTitle": "Anteckningsitel",
|
||||
"noteContent": "Anteckningsinnehåll",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Bläddra efter bild",
|
||||
"noNotes": "Inga anteckningar för detta projekt.",
|
||||
"deleteProject": "Ta bort projekt",
|
||||
"createSuccess": "Projekt skapat!"
|
||||
"createSuccess": "Projekt skapat!",
|
||||
"createdAndAssigned": "Projekt skapat och tilldelat",
|
||||
"createError": "Misslyckades med att skapa projekt",
|
||||
"viewProject": "Gå till projekt"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Detta fält är obligatoriskt",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Deluppgifter",
|
||||
"noSubtasks": "Inga deluppgifter än",
|
||||
"recentActivity": "Senaste aktivitet",
|
||||
"noActivityYet": "Ingen aktivitet än"
|
||||
"noActivityYet": "Ingen aktivitet än",
|
||||
"noSubtasksClickToAdd": "Inga deluppgifter ännu, klicka för att lägga till",
|
||||
"project": "Projekt",
|
||||
"noProject": "Inget projekt - Klicka för att tilldela",
|
||||
"tags": "Taggar",
|
||||
"noTags": "Inga taggar",
|
||||
"priority": "Prioritet",
|
||||
"dueDate": "Förfallodatum",
|
||||
"recurringSetup": "Återkommande inställning",
|
||||
"notRecurring": "Denna uppgift är inte återkommande ännu.",
|
||||
"clickToEditTitle": "Klicka för att redigera titel",
|
||||
"clickToEditContent": "Klicka för att redigera innehåll",
|
||||
"clickToAddContent": "Klicka för att lägga till innehåll",
|
||||
"clickToEditSubtasks": "Klicka för att redigera deluppgifter",
|
||||
"clickToAddOrEditSubtasks": "Klicka för att lägga till eller redigera deluppgifter",
|
||||
"contentPlaceholder": "Lägg till innehåll här... (Markdown stöds)",
|
||||
"contentEditHint": "Tryck Cmd/Ctrl+Enter för att spara, Esc för att avbryta",
|
||||
"noContentPreview": "Inga innehåll att förhandsgranska. Väx till redigeringsläge för att lägga till innehåll.",
|
||||
"deleteConfirmTitle": "Ta bort uppgift",
|
||||
"deleteConfirmMessage": "Är du säker på att du vill ta bort denna uppgift? Denna åtgärd kan inte ångras.",
|
||||
"noMoreIterations": "Inga fler iterationer schemalagda",
|
||||
"nextOccurrences": "Nästa förekomster",
|
||||
"nextOccurrencesAfterThis": "Nästa förekomster efter detta",
|
||||
"thisTask": "Denna uppgift",
|
||||
"is": "är",
|
||||
"and": "och",
|
||||
"dueOn": "förfall",
|
||||
"inProject": "från projekt",
|
||||
"lowPriority": "låg prioritet",
|
||||
"mediumPriority": "medelhög prioritet",
|
||||
"highPriority": "hög prioritet",
|
||||
"inDays": "om {{count}} dagar",
|
||||
"daysAgo": "{{count}} dagar sedan",
|
||||
"tagsUpdated": "Taggar uppdaterade framgångsrikt",
|
||||
"tagsUpdateError": "Misslyckades med att uppdatera taggar",
|
||||
"recurrenceUpdated": "Återkommande uppdaterad framgångsrikt",
|
||||
"recurrenceUpdateError": "Misslyckades med att uppdatera återkommande",
|
||||
"dueDateUpdated": "Förfallodatum uppdaterat framgångsrikt",
|
||||
"dueDateUpdateError": "Misslyckades med att uppdatera förfallodatum",
|
||||
"titleUpdated": "Uppgiftens titel uppdaterad framgångsrikt",
|
||||
"titleUpdateError": "Misslyckades med att uppdatera uppgiftens titel",
|
||||
"contentUpdated": "Uppgiftens innehåll uppdaterat framgångsrikt",
|
||||
"contentUpdateError": "Misslyckades med att uppdatera uppgiftens innehåll",
|
||||
"subtasksUpdated": "Underrubriker uppdaterade framgångsrikt",
|
||||
"subtasksUpdateError": "Misslyckades med att uppdatera underrubriker",
|
||||
"projectUpdated": "Projekt uppdaterat framgångsrikt",
|
||||
"projectUpdateError": "Misslyckades med att uppdatera projekt",
|
||||
"projectCleared": "Projekt rensat framgångsrikt",
|
||||
"projectClearError": "Misslyckades med att rensa projekt",
|
||||
"priorityUpdated": "Prioritet uppdaterad framgångsrikt",
|
||||
"priorityUpdateError": "Misslyckades med att uppdatera prioritet",
|
||||
"status": {
|
||||
"notStarted": "inte påbörjad",
|
||||
"inProgress": "pågående",
|
||||
"done": "avslutad",
|
||||
"archived": "arkiverad",
|
||||
"unknown": "pågår"
|
||||
},
|
||||
"noDueDate": "Ingen förfallodatum",
|
||||
"instanceOf": "Detta är en instans av en återkommande uppgift",
|
||||
"parentTask": "Överordnad uppgift",
|
||||
"includingToday": "inklusive idag",
|
||||
"has": "har",
|
||||
"fromProject": "från projektet"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Laddar projekt...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "icke-återkommande",
|
||||
"instances": "återkommande instanser"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Lägg till en deluppgift..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Tekrar son tarihi değiştirildi",
|
||||
"recurrenceEndDate": "Tekrar son tarihi",
|
||||
"recurrence_type_changed": "Tekrar türü değişti",
|
||||
"recurrence_interval_changed": "Tekrar aralığı değişti"
|
||||
"recurrence_interval_changed": "Tekrar aralığı değişti",
|
||||
"completionBasedChanged": "Tamamlamaya dayalı tekrar değiştirildi",
|
||||
"projectIdChanged": "Bir projeye atandı",
|
||||
"recurrenceType": "Tekrar türü",
|
||||
"recurrenceTypeChanged": "Tekrar türü değiştirildi"
|
||||
},
|
||||
"justNow": "Şu anda",
|
||||
"minutesAgo": "{{minutes}}d önce",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Ayın Günü",
|
||||
"weekOfMonth": "Ayın Haftası",
|
||||
"recurrenceEndDate": "Bitiş tarihi (isteğe bağlı)",
|
||||
"completionBased": "Tamamlandıktan sonra tekrar et"
|
||||
"completionBased": "Tamamlandıktan sonra tekrar et",
|
||||
"repeatOn": "Şu tarihlerde tekrar et"
|
||||
},
|
||||
"projectSearchPlaceholder": "Proje ara veya oluştur...",
|
||||
"noMatchingProjects": "Eşleşen proje yok",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Ne yapılması gerektiği konusunda daha spesifik olmaya çalışın",
|
||||
"noVerb": "Hangi spesifik eylemi gerçekleştirmeniz gerekiyor? Bir fiille başlamayı deneyin.",
|
||||
"vague": "\"Ara\", \"Yaz\", \"Planla\" veya \"Araştır\" gibi bir eylem fiili ile başlamayı deneyin"
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Lütfen en az bir gün seçin"
|
||||
},
|
||||
"noteTitle": "Not Başlığı",
|
||||
"noteContent": "Not İçeriği",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Görseli Gözat",
|
||||
"noNotes": "Bu proje için not yok.",
|
||||
"deleteProject": "Projeyi Sil",
|
||||
"createSuccess": "Proje başarıyla oluşturuldu!"
|
||||
"createSuccess": "Proje başarıyla oluşturuldu!",
|
||||
"createdAndAssigned": "Proje oluşturuldu ve atandı",
|
||||
"createError": "Proje oluşturulamadı",
|
||||
"viewProject": "Projeye git"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Bu alan gereklidir",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Alt görevler",
|
||||
"noSubtasks": "Henüz alt görev yok",
|
||||
"recentActivity": "Son Aktivite",
|
||||
"noActivityYet": "Henüz hiçbir etkinlik yok"
|
||||
"noActivityYet": "Henüz hiçbir etkinlik yok",
|
||||
"noSubtasksClickToAdd": "Henüz alt görev yok, eklemek için tıklayın",
|
||||
"project": "Proje",
|
||||
"noProject": "Proje yok - Atamak için tıklayın",
|
||||
"tags": "Etiketler",
|
||||
"noTags": "Etiket yok",
|
||||
"priority": "Öncelik",
|
||||
"dueDate": "Son Tarih",
|
||||
"recurringSetup": "Tekrarlayan Ayar",
|
||||
"notRecurring": "Bu görev henüz tekrarlanmıyor.",
|
||||
"clickToEditTitle": "Başlığı düzenlemek için tıklayın",
|
||||
"clickToEditContent": "İçeriği düzenlemek için tıklayın",
|
||||
"clickToAddContent": "İçerik eklemek için tıklayın",
|
||||
"clickToEditSubtasks": "Alt görevleri düzenlemek için tıklayın",
|
||||
"clickToAddOrEditSubtasks": "Alt görev eklemek veya düzenlemek için tıklayın",
|
||||
"contentPlaceholder": "İçeriği buraya ekleyin... (Markdown destekleniyor)",
|
||||
"contentEditHint": "Kaydetmek için Cmd/Ctrl+Enter'a, iptal etmek için Esc tuşuna basın",
|
||||
"noContentPreview": "Önizlemek için içerik yok. İçerik eklemek için Düzenleme moduna geçin.",
|
||||
"deleteConfirmTitle": "Görevi Sil",
|
||||
"deleteConfirmMessage": "Bu görevi silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
|
||||
"noMoreIterations": "Daha fazla yineleme planlanmadı",
|
||||
"nextOccurrences": "Sonraki Oluşumlar",
|
||||
"nextOccurrencesAfterThis": "Bundan Sonraki Oluşumlar",
|
||||
"thisTask": "Bu görev",
|
||||
"is": "dır",
|
||||
"and": "ve",
|
||||
"dueOn": "vadesi",
|
||||
"inProject": "projeden",
|
||||
"lowPriority": "düşük öncelik",
|
||||
"mediumPriority": "orta öncelik",
|
||||
"highPriority": "yüksek öncelik",
|
||||
"inDays": "{{count}} gün içinde",
|
||||
"daysAgo": "{{count}} gün önce",
|
||||
"tagsUpdated": "Etiketler başarıyla güncellendi",
|
||||
"tagsUpdateError": "Etiketleri güncelleme başarısız oldu",
|
||||
"recurrenceUpdated": "Tekrar sıklığı başarıyla güncellendi",
|
||||
"recurrenceUpdateError": "Tekrar sıklığını güncelleme başarısız oldu",
|
||||
"dueDateUpdated": "Son tarih başarıyla güncellendi",
|
||||
"dueDateUpdateError": "Son tarihi güncelleme başarısız oldu",
|
||||
"titleUpdated": "Görev başlığı başarıyla güncellendi",
|
||||
"titleUpdateError": "Görev başlığını güncelleme başarısız oldu",
|
||||
"contentUpdated": "Görev içeriği başarıyla güncellendi",
|
||||
"contentUpdateError": "Görev içeriğini güncelleme başarısız oldu",
|
||||
"subtasksUpdated": "Alt görevler başarıyla güncellendi",
|
||||
"subtasksUpdateError": "Alt görevleri güncelleme başarısız oldu",
|
||||
"projectUpdated": "Proje başarıyla güncellendi",
|
||||
"projectUpdateError": "Projeyi güncelleme başarısız oldu",
|
||||
"projectCleared": "Proje başarıyla temizlendi",
|
||||
"projectClearError": "Projeyi temizleme başarısız oldu",
|
||||
"priorityUpdated": "Öncelik başarıyla güncellendi",
|
||||
"priorityUpdateError": "Önceliği güncelleme başarısız oldu",
|
||||
"status": {
|
||||
"notStarted": "başlamadı",
|
||||
"inProgress": "devam ediyor",
|
||||
"done": "tamamlandı",
|
||||
"archived": "arşivlendi",
|
||||
"unknown": "süreçte"
|
||||
},
|
||||
"noDueDate": "Son tarih yok",
|
||||
"instanceOf": "Bu, tekrarlayan bir görevin bir örneğidir",
|
||||
"parentTask": "Üst Görev",
|
||||
"includingToday": "bugün dahil",
|
||||
"has": "var",
|
||||
"fromProject": "projeden"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Projeler yükleniyor...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "tekrarlamayan",
|
||||
"instances": "tekrarlayan örnekler"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Bir alt görev ekle..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Дата закінчення повторення змінена",
|
||||
"recurrenceEndDate": "Дата закінчення повторення",
|
||||
"recurrence_type_changed": "Тип повторення змінено",
|
||||
"recurrence_interval_changed": "Інтервал повторення змінено"
|
||||
"recurrence_interval_changed": "Інтервал повторення змінено",
|
||||
"completionBasedChanged": "Зміни в повторенні на основі завершення",
|
||||
"projectIdChanged": "Призначено проекту",
|
||||
"recurrenceType": "Тип повторення",
|
||||
"recurrenceTypeChanged": "Тип повторення змінено"
|
||||
},
|
||||
"justNow": "Щойно",
|
||||
"minutesAgo": "{{minutes}}м тому",
|
||||
|
|
@ -225,7 +229,8 @@
|
|||
"status": "Статус",
|
||||
"priority": "Пріоритет",
|
||||
"dueDate": "Термін виконання",
|
||||
"note": "Примітка"
|
||||
"note": "Примітка",
|
||||
"repeatOn": "Повторювати в"
|
||||
},
|
||||
"recurrenceSettings": "Налаштування повторення",
|
||||
"completionBasedHelp": "Якщо відмічено, наступне завдання буде створене на основі дати завершення замість дати виконання",
|
||||
|
|
@ -247,7 +252,8 @@
|
|||
"short": "Спробуйте бути більш конкретними щодо того, що потрібно зробити",
|
||||
"noVerb": "Які конкретні дії ви повинні виконати? Спробуйте почати з дієслова.",
|
||||
"vague": "Спробуйте почати з дієслова, наприклад \"Зателефонувати\", \"Написати\", \"Запланувати\", або \"Дослідити\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Будь ласка, виберіть принаймні один день"
|
||||
},
|
||||
"title": "Назва",
|
||||
"description": "Опис",
|
||||
|
|
@ -435,7 +441,10 @@
|
|||
"name": "Назва проекту",
|
||||
"noNotes": "Немає приміток для цього проекту.",
|
||||
"deleteProject": "Видалити проект",
|
||||
"createSuccess": "Проект успішно створено!"
|
||||
"createSuccess": "Проект успішно створено!",
|
||||
"createdAndAssigned": "Проект створено та призначено",
|
||||
"createError": "Не вдалося створити проект",
|
||||
"viewProject": "Перейти до проекту"
|
||||
},
|
||||
"profile": {
|
||||
"title": "Налаштування Профілю",
|
||||
|
|
@ -637,7 +646,70 @@
|
|||
"subtasks": "Підзавдання",
|
||||
"noSubtasks": "Ще немає підзавдань",
|
||||
"recentActivity": "Остання активність",
|
||||
"noActivityYet": "Ще немає активності"
|
||||
"noActivityYet": "Ще немає активності",
|
||||
"noSubtasksClickToAdd": "Немає підзадач, натисніть, щоб додати",
|
||||
"project": "Проект",
|
||||
"noProject": "Немає проекту - натисніть, щоб призначити",
|
||||
"tags": "Теги",
|
||||
"noTags": "Немає тегів",
|
||||
"priority": "Пріоритет",
|
||||
"dueDate": "Термін виконання",
|
||||
"recurringSetup": "Налаштування повторення",
|
||||
"notRecurring": "Ця задача ще не є повторюваною.",
|
||||
"clickToEditTitle": "Натисніть, щоб редагувати заголовок",
|
||||
"clickToEditContent": "Натисніть, щоб редагувати вміст",
|
||||
"clickToAddContent": "Натисніть, щоб додати вміст",
|
||||
"clickToEditSubtasks": "Натисніть, щоб редагувати підзадачі",
|
||||
"clickToAddOrEditSubtasks": "Натисніть, щоб додати або редагувати підзадачі",
|
||||
"contentPlaceholder": "Додайте вміст тут... (підтримується Markdown)",
|
||||
"contentEditHint": "Натисніть Cmd/Ctrl+Enter, щоб зберегти, Esc, щоб скасувати",
|
||||
"noContentPreview": "Немає вмісту для попереднього перегляду. Перейдіть в режим редагування, щоб додати вміст.",
|
||||
"deleteConfirmTitle": "Видалити задачу",
|
||||
"deleteConfirmMessage": "Ви впевнені, що хочете видалити цю задачу? Цю дію не можна скасувати.",
|
||||
"noMoreIterations": "Більше ітерацій не заплановано",
|
||||
"nextOccurrences": "Наступні випадки",
|
||||
"nextOccurrencesAfterThis": "Наступні випадки після цього",
|
||||
"thisTask": "Ця задача",
|
||||
"is": "є",
|
||||
"and": "і",
|
||||
"dueOn": "термін",
|
||||
"inProject": "з проєкту",
|
||||
"lowPriority": "низький пріоритет",
|
||||
"mediumPriority": "середній пріоритет",
|
||||
"highPriority": "високий пріоритет",
|
||||
"inDays": "через {{count}} дні",
|
||||
"daysAgo": "{{count}} днів тому",
|
||||
"tagsUpdated": "Теги успішно оновлено",
|
||||
"tagsUpdateError": "Не вдалося оновити теги",
|
||||
"recurrenceUpdated": "Повторення успішно оновлено",
|
||||
"recurrenceUpdateError": "Не вдалося оновити повторення",
|
||||
"dueDateUpdated": "Термін виконання успішно оновлено",
|
||||
"dueDateUpdateError": "Не вдалося оновити термін виконання",
|
||||
"titleUpdated": "Назву завдання успішно оновлено",
|
||||
"titleUpdateError": "Не вдалося оновити назву завдання",
|
||||
"contentUpdated": "Зміст завдання успішно оновлено",
|
||||
"contentUpdateError": "Не вдалося оновити зміст завдання",
|
||||
"subtasksUpdated": "Підзавдання успішно оновлено",
|
||||
"subtasksUpdateError": "Не вдалося оновити підзавдання",
|
||||
"projectUpdated": "Проект успішно оновлено",
|
||||
"projectUpdateError": "Не вдалося оновити проект",
|
||||
"projectCleared": "Проект успішно очищено",
|
||||
"projectClearError": "Не вдалося очистити проект",
|
||||
"priorityUpdated": "Пріоритет успішно оновлено",
|
||||
"priorityUpdateError": "Не вдалося оновити пріоритет",
|
||||
"status": {
|
||||
"notStarted": "не розпочато",
|
||||
"inProgress": "в процесі",
|
||||
"done": "завершено",
|
||||
"archived": "архівовано",
|
||||
"unknown": "триває"
|
||||
},
|
||||
"noDueDate": "Без терміну виконання",
|
||||
"instanceOf": "Це екземпляр повторювального завдання",
|
||||
"parentTask": "Батьківське завдання",
|
||||
"includingToday": "включаючи сьогодні",
|
||||
"has": "має",
|
||||
"fromProject": "з проєкту"
|
||||
},
|
||||
"calendar": {
|
||||
"month": "Місяць",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "неповторювані",
|
||||
"instances": "повторювані екземпляри"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Додати підзадачу..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "Ngày kết thúc chu kỳ đã thay đổi",
|
||||
"recurrenceEndDate": "Ngày kết thúc chu kỳ",
|
||||
"recurrence_type_changed": "Loại tái diễn đã thay đổi",
|
||||
"recurrence_interval_changed": "Khoảng thời gian tái diễn đã thay đổi"
|
||||
"recurrence_interval_changed": "Khoảng thời gian tái diễn đã thay đổi",
|
||||
"completionBasedChanged": "Thay đổi tần suất dựa trên hoàn thành",
|
||||
"projectIdChanged": "Được gán cho một dự án",
|
||||
"recurrenceType": "Loại tần suất",
|
||||
"recurrenceTypeChanged": "Thay đổi loại tần suất"
|
||||
},
|
||||
"justNow": "Vừa xong",
|
||||
"minutesAgo": "{{minutes}} phút trước",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "Ngày trong tháng",
|
||||
"weekOfMonth": "Tuần trong tháng",
|
||||
"recurrenceEndDate": "Ngày kết thúc (tùy chọn)",
|
||||
"completionBased": "Lặp lại sau khi hoàn thành"
|
||||
"completionBased": "Lặp lại sau khi hoàn thành",
|
||||
"repeatOn": "Lặp lại vào"
|
||||
},
|
||||
"projectSearchPlaceholder": "Tìm kiếm hoặc tạo một dự án...",
|
||||
"noMatchingProjects": "Không có dự án nào phù hợp",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "Hãy cố gắng cụ thể hơn về những gì cần làm",
|
||||
"noVerb": "Bạn cần thực hiện hành động cụ thể nào? Hãy thử bắt đầu bằng một động từ.",
|
||||
"vague": "Hãy thử bắt đầu bằng một động từ hành động như \"Gọi\", \"Viết\", \"Lên lịch\", hoặc \"Nghiên cứu\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "Vui lòng chọn ít nhất một ngày"
|
||||
},
|
||||
"noteTitle": "Tiêu đề ghi chú",
|
||||
"noteContent": "Nội dung ghi chú",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "Duyệt Hình Ảnh",
|
||||
"noNotes": "Không có ghi chú cho dự án này.",
|
||||
"deleteProject": "Xóa Dự Án",
|
||||
"createSuccess": "Dự án đã được tạo thành công!"
|
||||
"createSuccess": "Dự án đã được tạo thành công!",
|
||||
"createdAndAssigned": "Dự án đã được tạo và gán",
|
||||
"createError": "Tạo dự án không thành công",
|
||||
"viewProject": "Đi đến dự án"
|
||||
},
|
||||
"errors": {
|
||||
"required": "Trường này là bắt buộc",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "Công việc con",
|
||||
"noSubtasks": "Chưa có công việc con nào",
|
||||
"recentActivity": "Hoạt động gần đây",
|
||||
"noActivityYet": "Chưa có hoạt động nào"
|
||||
"noActivityYet": "Chưa có hoạt động nào",
|
||||
"noSubtasksClickToAdd": "Chưa có công việc con, nhấp để thêm",
|
||||
"project": "Dự án",
|
||||
"noProject": "Không có dự án - Nhấp để gán",
|
||||
"tags": "Thẻ",
|
||||
"noTags": "Không có thẻ",
|
||||
"priority": "Độ ưu tiên",
|
||||
"dueDate": "Ngày hết hạn",
|
||||
"recurringSetup": "Cài đặt lặp lại",
|
||||
"notRecurring": "Công việc này chưa lặp lại.",
|
||||
"clickToEditTitle": "Nhấp để chỉnh sửa tiêu đề",
|
||||
"clickToEditContent": "Nhấp để chỉnh sửa nội dung",
|
||||
"clickToAddContent": "Nhấp để thêm nội dung",
|
||||
"clickToEditSubtasks": "Nhấp để chỉnh sửa các công việc con",
|
||||
"clickToAddOrEditSubtasks": "Nhấp để thêm hoặc chỉnh sửa các công việc con",
|
||||
"contentPlaceholder": "Thêm nội dung ở đây... (hỗ trợ Markdown)",
|
||||
"contentEditHint": "Nhấn Cmd/Ctrl+Enter để lưu, Esc để hủy",
|
||||
"noContentPreview": "Không có nội dung để xem trước. Chuyển sang chế độ Chỉnh sửa để thêm nội dung.",
|
||||
"deleteConfirmTitle": "Xóa Công việc",
|
||||
"deleteConfirmMessage": "Bạn có chắc chắn muốn xóa công việc này không? Hành động này không thể hoàn tác.",
|
||||
"noMoreIterations": "Không còn lần lặp nào được lên lịch",
|
||||
"nextOccurrences": "Các lần xuất hiện tiếp theo",
|
||||
"nextOccurrencesAfterThis": "Các lần xuất hiện tiếp theo sau cái này",
|
||||
"thisTask": "Công việc này",
|
||||
"is": "là",
|
||||
"and": "và",
|
||||
"dueOn": "hạn",
|
||||
"inProject": "từ dự án",
|
||||
"lowPriority": "ưu tiên thấp",
|
||||
"mediumPriority": "ưu tiên trung bình",
|
||||
"highPriority": "ưu tiên cao",
|
||||
"inDays": "trong {{count}} ngày",
|
||||
"daysAgo": "{{count}} ngày trước",
|
||||
"tagsUpdated": "Cập nhật thẻ thành công",
|
||||
"tagsUpdateError": "Cập nhật thẻ thất bại",
|
||||
"recurrenceUpdated": "Cập nhật chu kỳ thành công",
|
||||
"recurrenceUpdateError": "Cập nhật chu kỳ thất bại",
|
||||
"dueDateUpdated": "Cập nhật ngày đến hạn thành công",
|
||||
"dueDateUpdateError": "Cập nhật ngày đến hạn thất bại",
|
||||
"titleUpdated": "Cập nhật tiêu đề nhiệm vụ thành công",
|
||||
"titleUpdateError": "Cập nhật tiêu đề nhiệm vụ thất bại",
|
||||
"contentUpdated": "Cập nhật nội dung nhiệm vụ thành công",
|
||||
"contentUpdateError": "Cập nhật nội dung nhiệm vụ thất bại",
|
||||
"subtasksUpdated": "Cập nhật nhiệm vụ con thành công",
|
||||
"subtasksUpdateError": "Cập nhật nhiệm vụ con thất bại",
|
||||
"projectUpdated": "Cập nhật dự án thành công",
|
||||
"projectUpdateError": "Cập nhật dự án thất bại",
|
||||
"projectCleared": "Dự án đã được xóa thành công",
|
||||
"projectClearError": "Xóa dự án thất bại",
|
||||
"priorityUpdated": "Cập nhật độ ưu tiên thành công",
|
||||
"priorityUpdateError": "Cập nhật độ ưu tiên thất bại",
|
||||
"status": {
|
||||
"notStarted": "chưa bắt đầu",
|
||||
"inProgress": "đang tiến hành",
|
||||
"done": "đã hoàn thành",
|
||||
"archived": "đã lưu trữ",
|
||||
"unknown": "đang diễn ra"
|
||||
},
|
||||
"noDueDate": "Không có ngày hết hạn",
|
||||
"instanceOf": "Đây là một phiên bản của một nhiệm vụ định kỳ",
|
||||
"parentTask": "Nhiệm vụ Cha",
|
||||
"includingToday": "bao gồm hôm nay",
|
||||
"has": "có",
|
||||
"fromProject": "từ dự án"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "Đang tải dự án...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "không lặp lại",
|
||||
"instances": "các phiên bản lặp lại"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "Thêm một công việc phụ..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@
|
|||
"recurrenceEndDateChanged": "重复结束日期已更改",
|
||||
"recurrenceEndDate": "重复结束日期",
|
||||
"recurrence_type_changed": "重复类型已更改",
|
||||
"recurrence_interval_changed": "重复间隔已更改"
|
||||
"recurrence_interval_changed": "重复间隔已更改",
|
||||
"completionBasedChanged": "基于完成的重复已更改",
|
||||
"projectIdChanged": "已分配到项目",
|
||||
"recurrenceType": "重复类型",
|
||||
"recurrenceTypeChanged": "重复类型已更改"
|
||||
},
|
||||
"justNow": "刚刚",
|
||||
"minutesAgo": "{{minutes}}分钟前",
|
||||
|
|
@ -410,7 +414,8 @@
|
|||
"monthDay": "每月的天",
|
||||
"weekOfMonth": "每月的周",
|
||||
"recurrenceEndDate": "结束日期(可选)",
|
||||
"completionBased": "完成后重复"
|
||||
"completionBased": "完成后重复",
|
||||
"repeatOn": "重复于"
|
||||
},
|
||||
"projectSearchPlaceholder": "搜索或创建项目...",
|
||||
"noMatchingProjects": "没有匹配的项目",
|
||||
|
|
@ -431,7 +436,8 @@
|
|||
"short": "尽量更具体地说明需要做什么",
|
||||
"noVerb": "你需要采取什么具体行动?尝试以动词开头。",
|
||||
"vague": "尝试以动作动词开头,例如 \"打电话\"、\"写\"、\"安排\" 或 \"研究\""
|
||||
}
|
||||
},
|
||||
"selectAtLeastOneDay": "请至少选择一天"
|
||||
},
|
||||
"noteTitle": "笔记标题",
|
||||
"noteContent": "笔记内容",
|
||||
|
|
@ -506,7 +512,10 @@
|
|||
"browseImage": "浏览图片",
|
||||
"noNotes": "此项目没有备注。",
|
||||
"deleteProject": "删除项目",
|
||||
"createSuccess": "项目创建成功!"
|
||||
"createSuccess": "项目创建成功!",
|
||||
"createdAndAssigned": "项目已创建并分配",
|
||||
"createError": "创建项目失败",
|
||||
"viewProject": "前往项目"
|
||||
},
|
||||
"errors": {
|
||||
"required": "此字段为必填项",
|
||||
|
|
@ -661,7 +670,70 @@
|
|||
"subtasks": "子任务",
|
||||
"noSubtasks": "尚无子任务",
|
||||
"recentActivity": "最近活动",
|
||||
"noActivityYet": "尚无活动"
|
||||
"noActivityYet": "尚无活动",
|
||||
"noSubtasksClickToAdd": "尚无子任务,点击添加",
|
||||
"project": "项目",
|
||||
"noProject": "没有项目 - 点击分配",
|
||||
"tags": "标签",
|
||||
"noTags": "没有标签",
|
||||
"priority": "优先级",
|
||||
"dueDate": "截止日期",
|
||||
"recurringSetup": "重复设置",
|
||||
"notRecurring": "此任务尚未重复。",
|
||||
"clickToEditTitle": "点击编辑标题",
|
||||
"clickToEditContent": "点击编辑内容",
|
||||
"clickToAddContent": "点击添加内容",
|
||||
"clickToEditSubtasks": "点击编辑子任务",
|
||||
"clickToAddOrEditSubtasks": "点击添加或编辑子任务",
|
||||
"contentPlaceholder": "在这里添加内容...(支持Markdown)",
|
||||
"contentEditHint": "按 Cmd/Ctrl+Enter 保存,按 Esc 取消",
|
||||
"noContentPreview": "没有内容可预览。切换到编辑模式以添加内容。",
|
||||
"deleteConfirmTitle": "删除任务",
|
||||
"deleteConfirmMessage": "您确定要删除此任务吗?此操作无法撤销。",
|
||||
"noMoreIterations": "没有更多计划的迭代",
|
||||
"nextOccurrences": "下一个发生",
|
||||
"nextOccurrencesAfterThis": "此后的下一个发生",
|
||||
"thisTask": "此任务",
|
||||
"is": "是",
|
||||
"and": "和",
|
||||
"dueOn": "到期",
|
||||
"inProject": "来自项目",
|
||||
"lowPriority": "低优先级",
|
||||
"mediumPriority": "中优先级",
|
||||
"highPriority": "高优先级",
|
||||
"inDays": "在 {{count}} 天内",
|
||||
"daysAgo": "{{count}} 天前",
|
||||
"tagsUpdated": "标签更新成功",
|
||||
"tagsUpdateError": "更新标签失败",
|
||||
"recurrenceUpdated": "重复更新成功",
|
||||
"recurrenceUpdateError": "更新重复失败",
|
||||
"dueDateUpdated": "截止日期更新成功",
|
||||
"dueDateUpdateError": "更新截止日期失败",
|
||||
"titleUpdated": "任务标题更新成功",
|
||||
"titleUpdateError": "更新任务标题失败",
|
||||
"contentUpdated": "任务内容更新成功",
|
||||
"contentUpdateError": "更新任务内容失败",
|
||||
"subtasksUpdated": "子任务更新成功",
|
||||
"subtasksUpdateError": "更新子任务失败",
|
||||
"projectUpdated": "项目更新成功",
|
||||
"projectUpdateError": "更新项目失败",
|
||||
"projectCleared": "项目清除成功",
|
||||
"projectClearError": "清除项目失败",
|
||||
"priorityUpdated": "优先级更新成功",
|
||||
"priorityUpdateError": "更新优先级失败",
|
||||
"status": {
|
||||
"notStarted": "未开始",
|
||||
"inProgress": "进行中",
|
||||
"done": "已完成",
|
||||
"archived": "已归档",
|
||||
"unknown": "进行中"
|
||||
},
|
||||
"noDueDate": "没有截止日期",
|
||||
"instanceOf": "这是一个重复任务的实例",
|
||||
"parentTask": "父任务",
|
||||
"includingToday": "包括今天",
|
||||
"has": "有",
|
||||
"fromProject": "来自项目"
|
||||
},
|
||||
"projects": {
|
||||
"loading": "加载项目中...",
|
||||
|
|
@ -1062,5 +1134,8 @@
|
|||
"nonRecurring": "非循环",
|
||||
"instances": "循环实例"
|
||||
}
|
||||
},
|
||||
"subtasks": {
|
||||
"placeholder": "添加子任务..."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue