diff --git a/components/reui/data-grid/data-grid.tsx b/components/reui/data-grid/data-grid.tsx index 92f7c0e1..08521c87 100644 --- a/components/reui/data-grid/data-grid.tsx +++ b/components/reui/data-grid/data-grid.tsx @@ -951,6 +951,8 @@ function DataGridProvider({ ) const tableState = table.state + const tableLayoutKey = JSON.stringify(props.tableLayout) + const tableClassNamesKey = JSON.stringify(props.tableClassNames) // Memoize context value so consumers don't re-render during column resize. // Column sizing state is intentionally excluded from deps -- CSS variables @@ -984,10 +986,8 @@ function DataGridProvider({ props.isLoading, props.loadingMode, props.className, - // eslint-disable-next-line react-hooks/exhaustive-deps - JSON.stringify(props.tableLayout), - // eslint-disable-next-line react-hooks/exhaustive-deps - JSON.stringify(props.tableClassNames), + tableLayoutKey, + tableClassNamesKey, tableState.sorting, tableState.pagination, tableState.columnFilters, @@ -1112,4 +1112,4 @@ function DataGridContainer({ ) } -export { useDataGrid, DataGridProvider, DataGrid, DataGridContainer } \ No newline at end of file +export { useDataGrid, DataGridProvider, DataGrid, DataGridContainer } diff --git a/docs/reui-migration-lint.md b/docs/reui-migration-lint.md index 45c35329..1e599ec3 100644 --- a/docs/reui-migration-lint.md +++ b/docs/reui-migration-lint.md @@ -1,56 +1,54 @@ -# ReUI: исходные замечания установленного реестра +# ReUI: оставшиеся замечания реестра -2026-09-13. Команда: `npx eslint components/reui/data-grid components/reui/filters components/reui/cascader`. 23 ошибки, 27 предупреждений. Правила не отключены. Требует разбора перед завершением этапа 2. +2026-09-13. `npx eslint components/reui/data-grid components/reui/filters components/reui/cascader --format json`. Осталось 21 ошибка и 27 предупреждений (было 23 и 27). Две ошибки сложных выражений в зависимостях useMemo исправлены без изменения семантики сравнения. Правила не отключены. -| Файл | Замечание | -| --- | --- | -| `components/reui/cascader/cascader-async.tsx` | 786:7 error Error: Calling setState synchronously within an effect can trigger cascading renders | -| `components/reui/cascader/cascader-virtual.tsx` | 132:5 error Error: Calling setState synchronously within an effect can trigger cascading renders | -| `components/reui/cascader/cascader.tsx` | 934:15 error Error: Cannot access refs during render | -| `components/reui/cascader/cascader.tsx:934:15` | 934:15 error Error: Cannot access refs during render | -| `components/reui/cascader/cascader.tsx:934:15` | 1089:22 error Error: Calling setState synchronously within an effect can trigger cascading renders | -| `components/reui/cascader/cascader.tsx:1089:22` | 1142:5 error Error: Calling setState synchronously within an effect can trigger cascading renders | -| `components/reui/cascader/cascader.tsx:1142:5` | 1672:5 error Error: Calling setState synchronously within an effect can trigger cascading renders | -| `components/reui/cascader/cascader.tsx:1672:5` | 1688:27 error Error: Calling setState synchronously within an effect can trigger cascading renders | -| `components/reui/cascader/cascader.tsx:1688:27` | 2111:45 error Error: Cannot access refs during render | -| `components/reui/cascader/cascader.tsx:2111:45` | 2112:36 error Error: Cannot access refs during render | -| `components/reui/data-grid/data-grid-scroll-area.tsx` | 234:7 error Error: Calling setState synchronously within an effect can trigger cascading renders | -| `components/reui/data-grid/data-grid-table-dnd-rows.tsx` | 62:3 warning 'verticalListSortingStrategy' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars | -| `components/reui/data-grid/data-grid-table-dnd-rows.tsx` | 67:39 warning 'Table' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars | -| `components/reui/data-grid/data-grid-table-dnd-rows.tsx` | 454:5 error Error: Calling setState synchronously within an effect can trigger cascading renders | -| `components/reui/data-grid/data-grid-table-dnd.tsx` | 61:3 warning 'Table' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars | -| `components/reui/data-grid/data-grid-table-virtual.tsx` | 32:28 warning 'Table' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars | -| `components/reui/data-grid/data-grid-table-virtual.tsx` | 762:23 warning Compilation Skipped: Use of incompatible library | -| `components/reui/data-grid/data-grid-table-virtual.tsx:762:23` | 807:5 warning Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps') | -| `components/reui/data-grid/data-grid-table-virtual.tsx:762:23` | 811:5 warning Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps') | -| `components/reui/data-grid/data-grid-table-virtual.tsx:762:23` | 813:5 warning Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps') | -| `components/reui/data-grid/data-grid-table-virtual.tsx:762:23` | 815:5 warning Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps') | -| `components/reui/data-grid/data-grid-table-virtual.tsx:762:23` | 817:5 warning Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps') | -| `components/reui/data-grid/data-grid-table-virtual.tsx:762:23` | 835:9 warning The 'virtualItems' conditional could make the dependencies of useEffect Hook (at line 1037) change on every render. To fix this, wrap the initialization of 'virtualItems' in its own useMemo() Hook react-hooks/exhaustive-deps | -| `components/reui/data-grid/data-grid-table-virtual.tsx:762:23` | 1052:3 warning Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps') | -| `components/reui/data-grid/data-grid-table.tsx` | 31:42 warning 'Table' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars | -| `components/reui/data-grid/data-grid-table.tsx` | 744:5 warning Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps') | -| `components/reui/data-grid/data-grid-table.tsx` | 746:5 warning Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps') | -| `components/reui/data-grid/data-grid-table.tsx` | 748:5 warning Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps') | -| `components/reui/data-grid/data-grid-table.tsx` | 750:5 warning Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps') | -| `components/reui/data-grid/data-grid-table.tsx` | 756:5 warning Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps') | -| `components/reui/data-grid/data-grid-table.tsx` | 959:3 warning 'rowId' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars | -| `components/reui/data-grid/data-grid-table.tsx` | 1463:11 warning 'table' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars | -| `components/reui/data-grid/data-grid-table.tsx` | 2342:30 warning 'TData' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars | -| `components/reui/data-grid/data-grid-table.tsx` | 2411:24 warning 'TData' is defined but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars | -| `components/reui/data-grid/data-grid.tsx` | 889:3 error Error: Cannot access refs during render | -| `components/reui/data-grid/data-grid.tsx:889:3` | 892:3 error Error: Cannot access refs during render | -| `components/reui/data-grid/data-grid.tsx:892:3` | 899:3 error Error: Cannot access refs during render | -| `components/reui/data-grid/data-grid.tsx:899:3` | 949:44 error Error: Cannot access refs during render | -| `components/reui/data-grid/data-grid.tsx:949:44` | 950:5 warning React Hook useMemo has an unnecessary dependency: 'table.store'. Either exclude it or remove the dependency array react-hooks/exhaustive-deps | -| `components/reui/data-grid/data-grid.tsx:949:44` | 988:7 error Error: Expected the dependency list to be an array of simple expressions (e.g. `x`, `x.y.z`, `x?.y?.z`) | -| `components/reui/data-grid/data-grid.tsx:988:7` | 990:7 error Error: Expected the dependency list to be an array of simple expressions (e.g. `x`, `x.y.z`, `x?.y?.z`) | -| `components/reui/filters/filters-advanced.tsx` | 757:18 error Error: Calling setState synchronously within an effect can trigger cascading renders | -| `components/reui/filters/filters-advanced.tsx:757:18` | 765:5 error Error: Calling setState synchronously within an effect can trigger cascading renders | -| `components/reui/filters/filters-advanced.tsx:765:5` | 1529:9 warning 'issueMap' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars | -| `components/reui/filters/filters-advanced.tsx:765:5` | 1544:6 warning React Hook React.useMemo has an unnecessary dependency: 'rowStateVersion'. Either exclude it or remove the dependency array react-hooks/exhaustive-deps | -| `components/reui/filters/filters-advanced.tsx:765:5` | 1566:9 warning 'focusFirstIssue' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars | -| `components/reui/filters/filters-chip.tsx` | 377:15 error Error: Calling setState synchronously within an effect can trigger cascading renders | -| `components/reui/filters/filters-chip.tsx:377:15` | 466:18 error Error: Calling setState synchronously within an effect can trigger cascading renders | -| `components/reui/filters/filters-chip.tsx:466:18` | 550:9 warning 'operator' is assigned a value but never used. Allowed unused vars must match /^_/u @typescript-eslint/no-unused-vars | -| `components/reui/filters/filters-chip.tsx:466:18` | 569:18 error Error: Calling setState synchronously within an effect can trigger cascading renders | +| Файл | Позиция | Уровень | Правило | Замечание | +| --- | --- | --- | --- | --- | +| `components/reui/cascader/cascader-async.tsx` | 786:7 | error | `react-hooks/set-state-in-effect` | Error: Calling setState synchronously within an effect can trigger cascading renders | +| `components/reui/cascader/cascader-virtual.tsx` | 132:5 | error | `react-hooks/set-state-in-effect` | Error: Calling setState synchronously within an effect can trigger cascading renders | +| `components/reui/cascader/cascader.tsx` | 934:15 | error | `react-hooks/refs` | Error: Cannot access refs during render | +| `components/reui/cascader/cascader.tsx` | 934:15 | error | `react-hooks/refs` | Error: Cannot access refs during render | +| `components/reui/cascader/cascader.tsx` | 1089:22 | error | `react-hooks/set-state-in-effect` | Error: Calling setState synchronously within an effect can trigger cascading renders | +| `components/reui/cascader/cascader.tsx` | 1142:5 | error | `react-hooks/set-state-in-effect` | Error: Calling setState synchronously within an effect can trigger cascading renders | +| `components/reui/cascader/cascader.tsx` | 1672:5 | error | `react-hooks/set-state-in-effect` | Error: Calling setState synchronously within an effect can trigger cascading renders | +| `components/reui/cascader/cascader.tsx` | 1688:27 | error | `react-hooks/set-state-in-effect` | Error: Calling setState synchronously within an effect can trigger cascading renders | +| `components/reui/cascader/cascader.tsx` | 2111:45 | error | `react-hooks/refs` | Error: Cannot access refs during render | +| `components/reui/cascader/cascader.tsx` | 2112:36 | error | `react-hooks/refs` | Error: Cannot access refs during render | +| `components/reui/data-grid/data-grid-scroll-area.tsx` | 234:7 | error | `react-hooks/set-state-in-effect` | Error: Calling setState synchronously within an effect can trigger cascading renders | +| `components/reui/data-grid/data-grid-table-dnd-rows.tsx` | 62:3 | warning | `@typescript-eslint/no-unused-vars` | 'verticalListSortingStrategy' is defined but never used. Allowed unused vars must match /^_/u. | +| `components/reui/data-grid/data-grid-table-dnd-rows.tsx` | 67:39 | warning | `@typescript-eslint/no-unused-vars` | 'Table' is defined but never used. Allowed unused vars must match /^_/u. | +| `components/reui/data-grid/data-grid-table-dnd-rows.tsx` | 454:5 | error | `react-hooks/set-state-in-effect` | Error: Calling setState synchronously within an effect can trigger cascading renders | +| `components/reui/data-grid/data-grid-table-dnd.tsx` | 61:3 | warning | `@typescript-eslint/no-unused-vars` | 'Table' is defined but never used. Allowed unused vars must match /^_/u. | +| `components/reui/data-grid/data-grid-table-virtual.tsx` | 32:28 | warning | `@typescript-eslint/no-unused-vars` | 'Table' is defined but never used. Allowed unused vars must match /^_/u. | +| `components/reui/data-grid/data-grid-table-virtual.tsx` | 762:23 | warning | `react-hooks/incompatible-library` | Compilation Skipped: Use of incompatible library | +| `components/reui/data-grid/data-grid-table-virtual.tsx` | 807:5 | warning | `directive` | Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps'). | +| `components/reui/data-grid/data-grid-table-virtual.tsx` | 811:5 | warning | `directive` | Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps'). | +| `components/reui/data-grid/data-grid-table-virtual.tsx` | 813:5 | warning | `directive` | Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps'). | +| `components/reui/data-grid/data-grid-table-virtual.tsx` | 815:5 | warning | `directive` | Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps'). | +| `components/reui/data-grid/data-grid-table-virtual.tsx` | 817:5 | warning | `directive` | Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps'). | +| `components/reui/data-grid/data-grid-table-virtual.tsx` | 835:9 | warning | `react-hooks/exhaustive-deps` | The 'virtualItems' conditional could make the dependencies of useEffect Hook (at line 1037) change on every render. To fix this, wrap the initialization of 'virtualItems' in its own useMemo() Hook. | +| `components/reui/data-grid/data-grid-table-virtual.tsx` | 1052:3 | warning | `directive` | Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps'). | +| `components/reui/data-grid/data-grid-table.tsx` | 31:42 | warning | `@typescript-eslint/no-unused-vars` | 'Table' is defined but never used. Allowed unused vars must match /^_/u. | +| `components/reui/data-grid/data-grid-table.tsx` | 744:5 | warning | `directive` | Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps'). | +| `components/reui/data-grid/data-grid-table.tsx` | 746:5 | warning | `directive` | Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps'). | +| `components/reui/data-grid/data-grid-table.tsx` | 748:5 | warning | `directive` | Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps'). | +| `components/reui/data-grid/data-grid-table.tsx` | 750:5 | warning | `directive` | Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps'). | +| `components/reui/data-grid/data-grid-table.tsx` | 756:5 | warning | `directive` | Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps'). | +| `components/reui/data-grid/data-grid-table.tsx` | 959:3 | warning | `@typescript-eslint/no-unused-vars` | 'rowId' is defined but never used. Allowed unused args must match /^_/u. | +| `components/reui/data-grid/data-grid-table.tsx` | 1463:11 | warning | `@typescript-eslint/no-unused-vars` | 'table' is assigned a value but never used. Allowed unused vars must match /^_/u. | +| `components/reui/data-grid/data-grid-table.tsx` | 2342:30 | warning | `@typescript-eslint/no-unused-vars` | 'TData' is defined but never used. Allowed unused vars must match /^_/u. | +| `components/reui/data-grid/data-grid-table.tsx` | 2411:24 | warning | `@typescript-eslint/no-unused-vars` | 'TData' is defined but never used. Allowed unused vars must match /^_/u. | +| `components/reui/data-grid/data-grid.tsx` | 889:3 | error | `react-hooks/refs` | Error: Cannot access refs during render | +| `components/reui/data-grid/data-grid.tsx` | 892:3 | error | `react-hooks/refs` | Error: Cannot access refs during render | +| `components/reui/data-grid/data-grid.tsx` | 899:3 | error | `react-hooks/refs` | Error: Cannot access refs during render | +| `components/reui/data-grid/data-grid.tsx` | 949:44 | error | `react-hooks/refs` | Error: Cannot access refs during render | +| `components/reui/data-grid/data-grid.tsx` | 950:5 | warning | `react-hooks/exhaustive-deps` | React Hook useMemo has an unnecessary dependency: 'table.store'. Either exclude it or remove the dependency array. | +| `components/reui/filters/filters-advanced.tsx` | 757:18 | error | `react-hooks/set-state-in-effect` | Error: Calling setState synchronously within an effect can trigger cascading renders | +| `components/reui/filters/filters-advanced.tsx` | 765:5 | error | `react-hooks/set-state-in-effect` | Error: Calling setState synchronously within an effect can trigger cascading renders | +| `components/reui/filters/filters-advanced.tsx` | 1529:9 | warning | `@typescript-eslint/no-unused-vars` | 'issueMap' is assigned a value but never used. Allowed unused vars must match /^_/u. | +| `components/reui/filters/filters-advanced.tsx` | 1544:6 | warning | `react-hooks/exhaustive-deps` | React Hook React.useMemo has an unnecessary dependency: 'rowStateVersion'. Either exclude it or remove the dependency array. | +| `components/reui/filters/filters-advanced.tsx` | 1566:9 | warning | `@typescript-eslint/no-unused-vars` | 'focusFirstIssue' is assigned a value but never used. Allowed unused vars must match /^_/u. | +| `components/reui/filters/filters-chip.tsx` | 377:15 | error | `react-hooks/set-state-in-effect` | Error: Calling setState synchronously within an effect can trigger cascading renders | +| `components/reui/filters/filters-chip.tsx` | 466:18 | error | `react-hooks/set-state-in-effect` | Error: Calling setState synchronously within an effect can trigger cascading renders | +| `components/reui/filters/filters-chip.tsx` | 550:9 | warning | `@typescript-eslint/no-unused-vars` | 'operator' is assigned a value but never used. Allowed unused vars must match /^_/u. | +| `components/reui/filters/filters-chip.tsx` | 569:18 | error | `react-hooks/set-state-in-effect` | Error: Calling setState synchronously within an effect can trigger cascading renders | diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index d6304d54..4cf9d378 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -141,6 +141,12 @@ flowchart LR G[Старые Filters] -. этапы 2–4 .-> H[FilterQuery: AND / OR] ``` +### Малый блок после промежуточного сохранения + +По отдельному поручению пользователя выполнить работу в пределах 10% квоты; на старте фактически оставалось 9%. В `data-grid.tsx` сериализация `tableLayout` и `tableClassNames` вынесена в именованные ключи зависимостей useMemo. Сравнение по содержимому сохранено, два замечания React Compiler устранены, правила не отключались. + +Проверки: TypeScript всего проекта прошёл; браузерный тест v9 (12 строк, сортировка, раскрытие) прошёл. Повторный lint группы: **21 ошибка, 27 предупреждений**, актуальный компактный отчёт — `docs/reui-migration-lint.md`. Production build не повторялся после этой локальной правки; предыдущая сборка этапа прошла. Этап 2 остаётся в работе; следующий объём прежний. + ## Карта миграции Текущая связка: @tanstack/react-table ^8.21.3, @tanstack/react-virtual ^3.14.4, base-nova. Актуальный ReUI MCP ранее подтвердил useTable/dataGridFeatures для Data Grid и дерево FilterQuery вместо filters/onChange для Filters. Перед установкой перепроверить совместимые версии, сохранить семантику существующих фильтров (простые условия → AND) и закрепить lockfile.