From 5d9a6f37577152c8c244297ea0f739331690323e Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sun, 4 Oct 2026 04:48:06 +0700 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=D0=BE=D0=B3=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=87=D0=B8=D1=82=D1=8C=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D0=B5=D0=B9=20=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/users/page.tsx | 13 ++++- components/data-grids/users-data-grid.tsx | 40 ++++++++++++---- docs/ux-ui-performance.md | 5 +- docs/ux-ui-plan.md | 2 +- docs/ux-ui-progress.md | 8 ++++ docs/ux-ui-stage-12.md | 8 ++++ docs/ux-ui/screens/large-users-320.png | Bin 0 -> 50486 bytes tests/e2e/large-users.spec.ts | 56 ++++++++++++++++++++++ 8 files changed, 118 insertions(+), 14 deletions(-) create mode 100644 docs/ux-ui/screens/large-users-320.png create mode 100644 tests/e2e/large-users.spec.ts diff --git a/app/(main)/users/page.tsx b/app/(main)/users/page.tsx index 6bcc83a7..8e561cde 100644 --- a/app/(main)/users/page.tsx +++ b/app/(main)/users/page.tsx @@ -1,7 +1,8 @@ "use client" -import { useCallback, useEffect, useRef, useState } from "react" +import { useCallback, useEffect, useRef, useState, useMemo } from "react" import { PageHeader } from "@/components/page-header" +import { DataPageToolbar } from "@/components/data-page-toolbar" import { DataPageCard } from "@/components/data-page-card" import { UsersDataGrid } from "@/components/data-grids/users-data-grid" import { KpiStatGrid } from "@/components/reui-kit/kpi-stat-grid" @@ -76,6 +77,11 @@ function UsersContent() { const canReadServers = can("mm:servers:read") const [users, setUsers] = useState(() => isLive ? [] : INIT_USERS) + const [userSearch, setUserSearch] = useState("") + const visibleUsers = useMemo(() => { + const query = userSearch.trim().toLocaleLowerCase("ru-RU") + return query ? users.filter(user => [user.name, user.login, user.email].some(value => value.toLocaleLowerCase("ru-RU").includes(query))) : users + }, [users, userSearch]) const [serverOptions, setServerOptions] = useState(() => isLive ? [] : toServerOptionsFromMock()) const [loading, setLoading] = useState(isLive && canRead) const [usersReadAt, setUsersReadAt] = useState(null) @@ -299,8 +305,11 @@ function UsersContent() { {/* Preview: https://reui.io/preview/base/data-grid-filtering-2 · https://reui.io/docs/components/base/data-grid · https://reui.io/docs/components/base/frame */} {canRead && (usersKnown || loading) && +