From 4d1dc2b6f926f30b433f0e84baf97554aca5a186 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: Tue, 29 Sep 2026 15:32:47 +0300 Subject: [PATCH] =?UTF-8?q?fix(users):=20fieldValues=20=D0=B2=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=BC=20=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=87=D0=B8=D0=BA=D0=B5=20/api/users/l?= =?UTF-8?q?ist=20+=20=D0=B3=D0=BE=D1=80=D0=B8=D0=B7=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=81=D0=BA=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D0=BB=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Причина «поля профиля не отображаются»: /api/users/list обслуживает СТАРЫЙ обработчик в auth.users.routes.ts (зарегистрирован раньше дубля handleListUsers в user.routes.ts — проверено: в ответе нет total/pageSize). includeFieldValues добавлен в оба, но реальный — теперь тоже отдаёт fieldValues. Плюс overflow-x-auto на контейнере таблицы — прокрутка при переполнении колонок. --- client/src/pages/Users.tsx | 2 +- server/routes/auth.users.routes.ts | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/client/src/pages/Users.tsx b/client/src/pages/Users.tsx index 9a076b1..562c030 100644 --- a/client/src/pages/Users.tsx +++ b/client/src/pages/Users.tsx @@ -1091,7 +1091,7 @@ const UsersPage = () => { )} -
+
diff --git a/server/routes/auth.users.routes.ts b/server/routes/auth.users.routes.ts index e9fab65..7e5f9b6 100644 --- a/server/routes/auth.users.routes.ts +++ b/server/routes/auth.users.routes.ts @@ -5,6 +5,9 @@ import { authService } from "../services/auth.service"; import { authenticateToken, requirePermission, type AuthenticatedRequest } from "../middleware/auth.middleware"; import { tenantIsolation } from "../middleware/tenant.middleware"; import { validateRequest } from "../middleware/validation.middleware"; +import { db } from "../db"; +import { inArray } from "drizzle-orm"; +import { userProfileFieldValues } from "@shared/schema"; import { createUserCustomFieldSchema, updateUserCustomFieldSchema, setUserCustomValueSchema, @@ -198,6 +201,22 @@ export function registerUserManagementRoutes(router: Router): void { return ''; }; + // Значения кастомных полей профиля — для реестра пользователей (выбор колонок). + // ВНИМАНИЕ: этот обработчик /api/users/list фактически обслуживает запросы + // (зарегистрирован раньше дубля в user.routes.ts handleListUsers). + const includeFieldValues = req.query.includeFieldValues === '1'; + const fieldValuesMap = new Map>(); + if (includeFieldValues && users.length > 0) { + const fvRows = await db + .select({ userId: userProfileFieldValues.userId, fieldId: userProfileFieldValues.fieldId, value: userProfileFieldValues.value }) + .from(userProfileFieldValues) + .where(inArray(userProfileFieldValues.userId, users.map(u => u.id))); + for (const row of fvRows) { + if (!fieldValuesMap.has(row.userId)) fieldValuesMap.set(row.userId, {}); + fieldValuesMap.get(row.userId)![row.fieldId] = row.value; + } + } + let safeUsers = users.map(user => ({ id: user.id, email: user.email, @@ -212,6 +231,7 @@ export function registerUserManagementRoutes(router: Router): void { lastActivityAt: user.lastActivityAt, createdAt: user.createdAt, organizationalRoles: roleMembersMap.get(user.id) || [], + ...(includeFieldValues ? { fieldValues: fieldValuesMap.get(user.id) || {} } : {}), })); Object.entries(filtersObj).forEach(([col, val]) => {