From 1bb6a53226b2fbdb34c69ab49330989bf8a51202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=D1=81=20=D0=A1=D1=83=D0=BB=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Mon, 3 Aug 2026 13:29:36 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8=20=D0=B2=20?= =?UTF-8?q?=D0=B3=D0=BB=D0=BE=D0=B1=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=BC=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B5=20=D0=B7=D0=B0=D1=87=D1=91?= =?UTF-8?q?=D1=80=D0=BA=D0=BD=D1=83=D1=82=D1=8B=20+=20=D0=B1=D0=B5=D0=B9?= =?UTF-8?q?=D0=B4=D0=B6=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit searchTasksByKeyword теперь возвращает isCompleted и через leftJoin formStatuses — statusName/statusColor/statusIsFinal. В HomeGlobalSearch закрытые задачи (isCompleted || statusIsFinal) зачёркнуты и приглушены, у каждой задачи цветной бейдж текущего статуса. --- client/src/components/HomeGlobalSearch.tsx | 35 +++++++++++++++------- server/storage.ts | 2 +- server/storage/tasks-core.storage.ts | 7 ++++- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/client/src/components/HomeGlobalSearch.tsx b/client/src/components/HomeGlobalSearch.tsx index 732b8e2..111874a 100644 --- a/client/src/components/HomeGlobalSearch.tsx +++ b/client/src/components/HomeGlobalSearch.tsx @@ -16,6 +16,10 @@ interface TaskItem { id: number; title: string; formId: number; + isCompleted?: boolean; + statusName?: string | null; + statusColor?: string | null; + statusIsFinal?: boolean | null; } interface HomeGlobalSearchProps { @@ -120,16 +124,27 @@ export function HomeGlobalSearch({ className }: HomeGlobalSearchProps) { {tasks.length > 0 && (
Задачи
- {tasks.map((t) => ( - - ))} + {tasks.map((t) => { + const isClosed = !!t.isCompleted || !!t.statusIsFinal; + return ( + + ); + })}
)} diff --git a/server/storage.ts b/server/storage.ts index 4b0cbdf..49fc527 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -195,7 +195,7 @@ export interface IStorage { updateTask(id: number, organizationId: number, updates: Partial): Promise; updateTaskIfNotModified(id: number, organizationId: number, updates: Partial, requiredUpdatedAt: Date): Promise; deleteTask(id: number, organizationId: number): Promise; - searchTasksByKeyword(organizationId: number, query: string, limit?: number): Promise[]>; + searchTasksByKeyword(organizationId: number, query: string, limit?: number): Promise<(Pick & { statusName: string | null; statusColor: string | null; statusIsFinal: boolean | null })[]>; // Task Field Values getTaskFieldValues(taskId: number, organizationId: number): Promise; diff --git a/server/storage/tasks-core.storage.ts b/server/storage/tasks-core.storage.ts index 343cbb9..2830527 100644 --- a/server/storage/tasks-core.storage.ts +++ b/server/storage/tasks-core.storage.ts @@ -347,7 +347,7 @@ export class TasksCoreStorage extends FormsStorage { organizationId: number, query: string, limit: number = 10 - ): Promise[]> { + ): Promise<(Pick & { statusName: string | null; statusColor: string | null; statusIsFinal: boolean | null })[]> { const pattern = `%${query}%`; const results = await db .select({ @@ -356,9 +356,14 @@ export class TasksCoreStorage extends FormsStorage { description: tasks.description, formId: tasks.formId, currentStatusId: tasks.currentStatusId, + isCompleted: tasks.isCompleted, + statusName: formStatuses.name, + statusColor: formStatuses.color, + statusIsFinal: formStatuses.isFinal, }) .from(tasks) .innerJoin(forms, eq(tasks.formId, forms.id)) + .leftJoin(formStatuses, eq(tasks.currentStatusId, formStatuses.id)) .where( and( eq(forms.organizationId, organizationId),