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]) => {