diff --git a/src/components/KanbanBoard.tsx b/src/components/KanbanBoard.tsx
index 6acfd20..28d72d2 100644
--- a/src/components/KanbanBoard.tsx
+++ b/src/components/KanbanBoard.tsx
@@ -111,6 +111,15 @@ export default function KanbanBoard({ projectId, projectSlug }: Props) {
)}
{task.title}
+ {task.labels && task.labels.length > 0 && (
+
+ {task.labels.map((label: string) => (
+
+ {label}
+
+ ))}
+
+ )}
{showMoveButtons && colIndex !== undefined && (
{colIndex > 0 && (
diff --git a/src/components/ProjectSettings.tsx b/src/components/ProjectSettings.tsx
index 11851d0..7722ee5 100644
--- a/src/components/ProjectSettings.tsx
+++ b/src/components/ProjectSettings.tsx
@@ -1,13 +1,16 @@
import { useState, useEffect } from "react";
import { useNavigate } from "react-router-dom";
-import type { Project, ProjectMember, Member } from "@/lib/api";
+import type { Project, ProjectMember, Member, Label } from "@/lib/api";
import {
updateProject,
deleteProject,
getProjectMembers,
addProjectMember,
removeProjectMember,
- getMembers
+ getMembers,
+ getLabels,
+ createLabel,
+ deleteLabel,
} from "@/lib/api";
interface Props {
@@ -31,6 +34,11 @@ export default function ProjectSettings({ project, onUpdated }: Props) {
const [loadingMembers, setLoadingMembers] = useState(true);
const [selectedMember, setSelectedMember] = useState("");
+ // Labels state
+ const [labels, setLabels] = useState
+ {/* Labels Section */}
+
+
Лейблы
+
+ {labels.map((label) => (
+
+
+
+ {label.name}
+
+
+
+ ))}
+
+
+ setNewLabelName(e.target.value)}
+ placeholder="Новый лейбл..."
+ className="flex-1 px-3 py-1.5 bg-[var(--bg)] border border-[var(--border)] rounded-lg text-sm outline-none"
+ />
+ setNewLabelColor(e.target.value)}
+ className="w-8 h-8 rounded cursor-pointer"
+ />
+
+
+
+
{/* Members Section */}
Участники
diff --git a/src/lib/api.ts b/src/lib/api.ts
index 6e4bc86..2a6987d 100644
--- a/src/lib/api.ts
+++ b/src/lib/api.ts
@@ -448,3 +448,31 @@ export async function createTaskLink(taskId: string, targetId: string, linkType:
export async function deleteTaskLink(taskId: string, linkId: string): Promise
{
return request(`/tasks/${taskId}/links/${linkId}`, { method: "DELETE" });
}
+
+// --- Labels ---
+export interface Label {
+ id: string;
+ project_id: string;
+ name: string;
+ color: string;
+}
+
+export async function getLabels(projectId: string): Promise