From ad709fb0f7c21cd05ec6765bd5cf6153808320e5 Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Fri, 6 Nov 2026 16:06:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{constants/FORM_1 => }/SMETA.test.js | 0 .../components/RealtimeTable/tableColumns.jsx | 7 +++++++ .../RealtimeTable/utils/columnUtils.js | 17 +++++++++++++++++ 3 files changed, 24 insertions(+) rename web/src/components/RealtimeTable/{constants/FORM_1 => }/SMETA.test.js (100%) diff --git a/web/src/components/RealtimeTable/constants/FORM_1/SMETA.test.js b/web/src/components/RealtimeTable/SMETA.test.js similarity index 100% rename from web/src/components/RealtimeTable/constants/FORM_1/SMETA.test.js rename to web/src/components/RealtimeTable/SMETA.test.js diff --git a/web/src/components/RealtimeTable/tableColumns.jsx b/web/src/components/RealtimeTable/tableColumns.jsx index 7bb4454..e1ef1f7 100644 --- a/web/src/components/RealtimeTable/tableColumns.jsx +++ b/web/src/components/RealtimeTable/tableColumns.jsx @@ -8,6 +8,7 @@ import { ROLES_NAME_ID } from '../../constants/constants'; import { blueColumn } from './constants/columnColors'; import { sectionCodeColor } from './constants/columnConfig'; import { isCellEditable } from './utils/cellEditability'; +import { getColumnValue } from './utils/columnUtils'; import VspDropdownEditCell from './Cell/EditCell/VspDropdownEditCell'; @@ -248,6 +249,12 @@ export const getTableColumns = ({ // Группирующие колонки-заголовки (есть col.columns) не рендерят Cell/Edit // по строкам сами — enableEditing им не нужен, в отличие от листовых. const isLeafColumn = !col.columns?.length; + if (isLeafColumn && !col.accessorFn && typeof col.accessorKey === 'string' && col.accessorKey.includes('.')) { + // MRT предупреждает об undefined для вложенных путей, отсутствующих + // у отдельных типов строк. Сохраняем исходный id для настроек и прав. + col.id = col.id ?? col.accessorKey; + col.accessorFn = (row) => getColumnValue(row, col.accessorKey); + } col.Cell = ({ cell, table, column, row }) => { const props = getCachedCellProps(row, column, table); diff --git a/web/src/components/RealtimeTable/utils/columnUtils.js b/web/src/components/RealtimeTable/utils/columnUtils.js index 769bbde..e8d1a00 100644 --- a/web/src/components/RealtimeTable/utils/columnUtils.js +++ b/web/src/components/RealtimeTable/utils/columnUtils.js @@ -1,6 +1,23 @@ // Явный id определяет технический ключ колонки; accessorKey используется как fallback. export const getColumnKey = (node) => node?.id ?? node?.accessorKey; +// У некоторых типов строк нет целого блока данных. NULL в существующей +// колонке при этом отличается от отсутствующего пути. +export const hasColumnPath = (row, path) => { + if (!row || typeof path !== 'string') return false; + let value = row; + for (const key of path.split('.')) { + if (value === null || typeof value !== 'object' || !Object.hasOwn(value, key)) return false; + value = value[key]; + } + return true; +}; + +export const getColumnValue = (row, path) => { + if (!hasColumnPath(row, path)) return null; + return path.split('.').reduce((value, key) => value[key], row); +}; + // Проверка, нужно ли скрыть колонку из дерева export const shouldExcludeFromTree = (node, excludeSet) => { if (node?.hideInTree) return true; -- 2.47.2