Таблица пользователей с пагинацией
Сделай таблицу пользователей с колонками «Имя», «Роль» и «Статус». Список users передаётся пропсом, показывать по десять строк на страницу с постраничной навигацией под таблицей. Статус показывай цветной меткой: активен или отключён.
users-table__readme__claude-code__claude-opus-5__1 · 23.09.2026, 20:03:27 мск
Проверки пройдены
README · claude-opus-5 · Claude CodeКонтекст до задачи~798
Токенов на прогон11 370
Цена$0.058
Ошибок компилятора0
Первый вызов модели получил 9 523 токена входа, включая системный промпт Claude Code. Контекст до задачи — оценка по длине текста, для русского текста она занижает число токенов в полтора-два раза.
Компилятор
Ошибок нет: все компоненты и пропсы существуют.
Линтер и покрытие
- inline-styleСтрока 65Инлайновые стили вместо классов и токенов библиотеки
Компоненты библиотеки
JxButton
Ожидались JxTable, JxPagination, JxBadge · покрытие 0%
README (README.md, ~644)
Вход 2 · выход 1 847 · из кэша 8 233 · в кэш 1 288 · 22 с
Рендер
Код компонента
tsx87 строк
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
import { useState } from 'react';
import { JxButton } from '@jinx-ui/react';
export type User = {
id: string;
name: string;
role: string;
active: boolean;
};
type UsersTableProps = {
users: User[];
pageSize?: number;
};
// Только JxButton подтверждён в README пакета; таблица и метка собраны
// на jx-* классах CSS-контракта @jinx-ui/core — сверь имена классов со сборкой.
export default function UsersTable({ users, pageSize = 10 }: UsersTableProps) {
const [page, setPage] = useState(0);
const pageCount = Math.max(1, Math.ceil(users.length / pageSize));
const current = Math.min(page, pageCount - 1);
const start = current * pageSize;
const rows = users.slice(start, start + pageSize);
return (
<div className="jx-stack">
<table className="jx-table">
<thead>
<tr>
<th scope="col">Имя</th>
<th scope="col">Роль</th>
<th scope="col">Статус</th>
</tr>
</thead>
<tbody>
{rows.map((user) => (
<tr key={user.id}>
<td>{user.name}</td>
<td>{user.role}</td>
<td>
<span
className={
user.active
? 'jx-badge jx-badge--success'
: 'jx-badge jx-badge--neutral'
}
>
{user.active ? 'Активен' : 'Отключён'}
</span>
</td>
</tr>
))}
{rows.length === 0 && (
<tr>
<td colSpan={3}>Пользователей нет</td>
</tr>
)}
</tbody>
</table>
<nav
className="jx-cluster"
aria-label="Постраничная навигация"
style={{ gap: 'var(--jx-space-2)' }}
>
<JxButton
variant="ghost"
disabled={current === 0}
onClick={() => setPage(current - 1)}
>
Назад
</JxButton>
<span aria-live="polite">
Страница {current + 1} из {pageCount}
</span>
<JxButton
variant="ghost"
disabled={current >= pageCount - 1}
onClick={() => setPage(current + 1)}
>
Вперёд
</JxButton>
</nav>
</div>
);
}