diff --git a/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx b/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx index 1478848..7212e7f 100644 --- a/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx +++ b/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx @@ -1,7 +1,8 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import { useMemo } from 'react'; import styled from '@emotion/styled'; import { useRealtime } from '../../contexts/RealtimeContext'; +import { toast } from 'react-toastify'; const ContainerForText = styled.span` @@ -42,7 +43,7 @@ const highlightText = (text, searchQuery) => { ); }; -const Cell = React.memo(({ cell, row, column, onClick, globalFilter, backgroundColor, color }) => { +const Cell = React.memo(({ cell, row, column, onClick, globalFilter, backgroundColor, color, isEditable }) => { const cellValue = cell.getValue(); const textValue = String(cellValue || ''); @@ -51,14 +52,11 @@ const Cell = React.memo(({ cell, row, column, onClick, globalFilter, backgroundC return highlightText(textValue, globalFilter); }, [textValue, globalFilter]); - const { - isCellLocked, - getCellLockInfo, - updateCell, - subscribeToErrors, - tryLockCell, - unlockCell - } = useRealtime(); + const lockedStyles = !isEditable ? { + border: '2px solid #d3d3d3', + color: '#525252', + cursor: 'not-allowed', + } : {}; return ( @@ -80,6 +78,7 @@ const Cell = React.memo(({ cell, row, column, onClick, globalFilter, backgroundC padding: '8px', backgroundColor: backgroundColor, color: color, + ...lockedStyles }} onClick={onClick} > diff --git a/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx b/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx index ec686de..68a87d3 100644 --- a/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx +++ b/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx @@ -7,7 +7,7 @@ const EditCell = ({ refCell, onChange, disabled, value }) => { const left = tdFrag.offsetLeft; const width = refCell.current.offsetParent.offsetWidth; - const translateY = 'translateY(' + trFrag.offsetTop + 'px)'; + const translateY = trFrag.style.transform; function useAutoResize(value) { const ref = useRef(null); @@ -71,7 +71,7 @@ const EditCell = ({ refCell, onChange, disabled, value }) => { }} onChange={handleChangeValue} value={curValue} - onBlur={handleChange} + onBlur={handleChange} /> diff --git a/web/src/components/RealtimeTable/RealtimeTable.jsx b/web/src/components/RealtimeTable/RealtimeTable.jsx index 1cdf94b..39e6f0b 100644 --- a/web/src/components/RealtimeTable/RealtimeTable.jsx +++ b/web/src/components/RealtimeTable/RealtimeTable.jsx @@ -1,5 +1,5 @@ // components/RealtimeTable/index.js -import React, { useState, useMemo, useRef, useEffect, useCallback } from 'react'; +import React, { useState, useMemo, useRef, useEffect, useCallback, useTransition } from 'react'; import { createPortal } from 'react-dom'; import { useMaterialReactTable, @@ -21,15 +21,22 @@ import { getTablePaperStyles, } from './constants/tableConfig'; import { useRealtime } from './contexts/RealtimeContext'; +import { toast } from 'react-toastify'; const RealtimeTable = ({ formType, formId, sheetName, direction }) => { const { data, setData } = useRealtimeData(formId, sheetName, direction); - const [isLoading, setIsLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [showColumnFilters, setShowColumnFilters] = useState(false); const [selectedColumn, setSelectedColumn] = useState(); - const columnVirtualizerInstanceRef = useRef(null); const [rowSelection, setRowSelection] = useState({}); + const [isLoadingData, setIsLoadingData] = useState(false); + const [isPending, startTransition] = useTransition(); + + const handleGlobalFilterChange = (value) => { + startTransition(() => { + setGlobalFilter(value); + }); + }; const { isConnected, @@ -40,6 +47,7 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => { error: wsError, updateCell: contextUpdateCell, addRow: contextAddRow, + deleteRow: contextDeleteRow, } = useRealtime(); const { @@ -83,9 +91,9 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => { setRowSelection((prev) => ({ [rowId]: !prev[rowId], })); - }, [rowSelection]) + }, []) + - // Создание колонок с интеграцией WebSocket const columns = useMemo(() => { if (!columnsConfig || !columnsConfig.columns) return []; try { @@ -106,7 +114,6 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => { } }, [columnsConfig, handleUpdateCell]); - // Метаданные для таблицы const tableMeta = useMemo(() => ({ updateCell: handleUpdateCell, }), [handleUpdateCell]); @@ -117,13 +124,17 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => { ...BASE_TABLE_CONFIG, columns, data: data, - columnVirtualizerInstanceRef, - enableRowVirtualization: false, + enableRowVirtualization: true, + rowVirtualizerOptions: { + overscan: 50, + scrollPaddingStart: 0, + scrollPaddingEnd: 0, + }, enableRowSelection: true, onRowSelectionChange: setRowSelection, onColumnSizingChange: setColumnSizing, onColumnPinningChange: setColumnPinning, - onGlobalFilterChange: setGlobalFilter, + onGlobalFilterChange: handleGlobalFilterChange, state: { columnSizing, columnPinning, @@ -133,7 +144,7 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => { rowSelection }, initialState: { - hiddenColumn: [] + expanded: true }, meta: tableMeta, muiTableHeadCellProps: ({ column }) => ({ @@ -151,22 +162,13 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => { height: '1px', minHeight: '1px', maxHeight: '1px', - opacity: 0, - pointerEvents: 'none', - backgroundColor: 'transparent', - '& th': { - height: '1px', - minHeight: '1px', - maxHeight: '1px', - }, + visibility: 'hidden', }, }, muiTablePaperProps: getTablePaperStyles(), muiTableContainerProps: { ref: containerRef, sx: { - overflowX: 'auto', - overflowY: 'auto', position: 'relative', contain: 'layout', minHeight: '100%', @@ -196,21 +198,41 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => { const table = useMaterialReactTable(tableConfig); + useEffect(() => { + if (table && data && columns.length !== 0) { + setIsLoadingData(true) + } + }, [data, columns, table]) + const handleAddRow = useCallback(() => { const allRows = table.getRowModel().rows; - // Фильтруем выделенные строки const selectedRows = allRows.filter(row => rowSelection[row.id]); if (selectedRows.length === 0) { - toasr.error('Выделите строку для вставки'); + toast.error('Выделите строку для вставки'); return; } const row = selectedRows[0]; const expense_item_id = row.original.data.header.expense_item_id; - contextAddRow({expense_item_id:expense_item_id}) + contextAddRow({ expense_item_id: expense_item_id }) }, [rowSelection, table]) + + const handleDeleteRow = useCallback(() => { + const allRows = table.getRowModel().rows; + + const selectedRows = allRows.filter(row => rowSelection[row.id]); + if (selectedRows.length === 0) { + toast.error('Выделите строку для удаления'); + return; + } + const row = selectedRows[0]; + const expense_item_id = row.original.data.line_id; + contextDeleteRow(expense_item_id) + setRowSelection({}); + }, [rowSelection, table]) + if (!data) { - return
Loading...
; + return
Загрузка...
; } return ( @@ -223,10 +245,12 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => { onToggleColumnVisibility={handleToggleColumnVisibility} columnVisibility={columnVisibility} onChangeSizeMult={setSizeMult} - onGlobalFilterChange={setGlobalFilter} + onGlobalFilterChange={handleGlobalFilterChange} sizeMult={sizeMult} onChangeShowColumnFilters={setShowColumnFilters} onAddRow={handleAddRow} + onDeleteRow={handleDeleteRow} + isLoadingData={isLoadingData} />
@@ -250,6 +274,7 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => { onHeaderSelect={setSelectedColumn} selectHeader={selectedColumn} onChangeWidth={handleSetColumnWidth} + isLoadingData={isLoadingData} />, headerPortalRef.current, )} diff --git a/web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx b/web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx index 225e5fe..6477c84 100644 --- a/web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx +++ b/web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx @@ -30,6 +30,8 @@ const SettingPanel = ({ sizeMult, onChangeShowColumnFilters, onAddRow, + onDeleteRow, + isLoadingData, }) => { const [isPinned, setIsPinned] = useState(false); const [columnTree, setColumnTree] = useState(); @@ -40,7 +42,7 @@ const SettingPanel = ({ if (!table) return; setColumnTree(table.getAllColumns()); setShowColumnFilters(table.getState().showColumnFilters); - }, [table]); + }, [table, isLoadingData]); useEffect(() => { if (!selectedColumn) return; @@ -55,6 +57,7 @@ const SettingPanel = ({ ); }, [columnVisibility]); + //TO DO: сделать const { addColorForCells, addFormulaForCells, deleteFormula } = {}; const handleChangeShowColumnFilters = () => { @@ -100,7 +103,7 @@ const SettingPanel = ({ - + diff --git a/web/src/components/RealtimeTable/TableHead/TableHead.jsx b/web/src/components/RealtimeTable/TableHead/TableHead.jsx index fe15262..45ba813 100644 --- a/web/src/components/RealtimeTable/TableHead/TableHead.jsx +++ b/web/src/components/RealtimeTable/TableHead/TableHead.jsx @@ -131,7 +131,6 @@ const HeaderCell = ({ header, table, onClick, hightlight, onChangeWidth }) => { // Если колонка не закреплена, текст должен начинаться после всех закрепленных колонок const getTextLeftOffset = () => { if (isPinned) { - // Для закрепленных колонок текст остается на месте return '0'; } // Для незакрепленных колонок текст должен начинаться после всех закрепленных @@ -215,7 +214,7 @@ const FilterRow = ({ table }) => { style={{ display: 'flex', position: 'sticky', - top: '1.5rem', // После строки с номерами колонок + top: '1.5rem', zIndex: 20, backgroundColor: 'white', }} @@ -338,11 +337,16 @@ export const TableHead = ({ onHeaderSelect, selectHeader, onChangeWidth, + isLoadingData, }) => { const handleHeaderClick = (header) => { onHeaderSelect(header); }; + if (!isLoadingData) { + return
+ } + return ( <>
0)", - "accessorKey":"2_kvartal_2026_uvelichenie_bazovogo_plana_0", - "columns":[ + header: "Увеличение базового плана( >0)", + accessorKey: "2_kvartal_2026_uvelichenie_bazovogo_plana_0", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.rev_inc", - "columnLetter":"DG", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.rev_inc", + columnLetter: "DG", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Cеквестр базового плана( <0)", - "accessorKey":"2_kvartal_2026_cekvestr_bazovogo_plana_0", - "columns":[ + header: "Cеквестр базового плана( <0)", + accessorKey: "2_kvartal_2026_cekvestr_bazovogo_plana_0", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.rev_seq", - "columnLetter":"DH", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.rev_seq", + columnLetter: "DH", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Комментарий", - "accessorKey":"2_kvartal_2026_kommentariy", - "columns":[ + header: "Комментарий", + accessorKey: "2_kvartal_2026_kommentariy", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.rev_comment", - "columnLetter":"DI", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.rev_comment", + columnLetter: "DI", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Новый план 2 кв 26", - "accessorKey":"2_kvartal_2026_novyy_plan_2_kv_26", - "columns":[ + header: "Новый план 2 кв 26", + accessorKey: "2_kvartal_2026_novyy_plan_2_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.new_plan", - "columnLetter":"DJ", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.new_plan", + columnLetter: "DJ", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"", - "accessorKey":"2_kvartal_2026_field", - "columns":[ + header: "", + accessorKey: "2_kvartal_2026_field", + columns: [ { - "header":"", - "accessorKey":"2_kvartal_2026_field_field", - "columnLetter":"DK", - "size":150, - "filterFn":"contains" - } + header: "", + accessorKey: "2_kvartal_2026_field_field", + columnLetter: "DK", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { - "header":"Текущие корректировки( = 0)", - "accessorKey":"2_kvartal_2026_tekuschie_korrektirovki_0", - "columns":[ + header: "Текущие корректировки( = 0)", + accessorKey: "2_kvartal_2026_tekuschie_korrektirovki_0", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.adj_current", - "columnLetter":"DL", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.adj_current", + columnLetter: "DL", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Корректировки с ССП / сметой развития", - "accessorKey":"2_kvartal_2026_korrektirovki_s_ssp_smetoy_razvitiya", - "columns":[ + header: "Корректировки с ССП / сметой развития", + accessorKey: "2_kvartal_2026_korrektirovki_s_ssp_smetoy_razvitiya", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.adj_ssp", - "columnLetter":"DM", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.adj_ssp", + columnLetter: "DM", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Корректировки с РФ", - "accessorKey":"2_kvartal_2026_korrektirovki_s_rf", - "columns":[ + header: "Корректировки с РФ", + accessorKey: "2_kvartal_2026_korrektirovki_s_rf", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.adj_rf", - "columnLetter":"DN", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.adj_rf", + columnLetter: "DN", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Корректировки из резерва", - "accessorKey":"2_kvartal_2026_korrektirovki_iz_rezerva", - "columns":[ + header: "Корректировки из резерва", + accessorKey: "2_kvartal_2026_korrektirovki_iz_rezerva", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.adj_reserve", - "columnLetter":"DO", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.adj_reserve", + columnLetter: "DO", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Перенос в 3 кв 26", - "accessorKey":"2_kvartal_2026_perenos_v_3_kv_26", - "columns":[ + header: "Перенос в 3 кв 26", + accessorKey: "2_kvartal_2026_perenos_v_3_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"2_kvartal_2026_perenos_v_3_kv_26_summa_tys_rub_bez_nds", - "columnLetter":"DP", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: + "2_kvartal_2026_perenos_v_3_kv_26_summa_tys_rub_bez_nds", + columnLetter: "DP", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Скорр. план 2 кв. 26", - "accessorKey":"2_kvartal_2026_skorr_plan_2_kv_26", - "columns":[ + header: "Скорр. план 2 кв. 26", + accessorKey: "2_kvartal_2026_skorr_plan_2_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.corrected_plan", - "columnLetter":"DR", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.corrected_plan", + columnLetter: "DR", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Платеж и предоставление акта", - "accessorKey":"2_kvartal_2026_platezh_i_predostavlenie_akta", - "columns":[ + header: "Платеж и предоставление акта", + accessorKey: "2_kvartal_2026_platezh_i_predostavlenie_akta", + columns: [ { - "header":"Дата платежа", - "accessorKey":"data.q2.pay_date", - "columnLetter":"DT", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "Дата платежа", + accessorKey: "data.q2.pay_date", + columnLetter: "DT", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.pay_amount", - "columnLetter":"DU", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.pay_amount", + columnLetter: "DU", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"в т.ч. сумма (без НДС) ГО", - "accessorKey":"data.q2.pay_ho", - "columnLetter":"DV", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "в т.ч. сумма (без НДС) ГО", + accessorKey: "data.q2.pay_ho", + columnLetter: "DV", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"в т.ч. сумма (без НДС) РФ", - "accessorKey":"data.q2.pay_rf", - "columnLetter":"DW", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "в т.ч. сумма (без НДС) РФ", + accessorKey: "data.q2.pay_rf", + columnLetter: "DW", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"Комментарий", - "accessorKey":"data.q2.pay_comment", - "columnLetter":"DX", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "Комментарий", + accessorKey: "data.q2.pay_comment", + columnLetter: "DX", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"Предоставление акта (др. подтверждения)", - "accessorKey":"data.q2.pay_act", - "columnLetter":"DY", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } - } + header: "Предоставление акта (др. подтверждения)", + accessorKey: "data.q2.pay_act", + columnLetter: "DY", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"Бронь 2 кв 26", - "accessorKey":"2_kvartal_2026_bron_2_kv_26", - "columns":[ + header: "Бронь 2 кв 26", + accessorKey: "2_kvartal_2026_bron_2_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.booking", - "columnLetter":"EA", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.booking", + columnLetter: "EA", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FABF8F", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FABF8F", + color: "#000000", + }, + }, }, { - "header":"Факт РСБУ апрель 26", - "accessorKey":"2_kvartal_2026_fakt_rsbu_aprel_26", - "columns":[ + header: "Факт РСБУ апрель 26", + accessorKey: "2_kvartal_2026_fakt_rsbu_aprel_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.actual_m1", - "columnLetter":"EB", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.actual_m1", + columnLetter: "EB", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Факт РСБУ май 26", - "accessorKey":"2_kvartal_2026_fakt_rsbu_may_26", - "columns":[ + header: "Факт РСБУ май 26", + accessorKey: "2_kvartal_2026_fakt_rsbu_may_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.actual_m2", - "columnLetter":"EC", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.actual_m2", + columnLetter: "EC", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Факт РСБУ июнь 26", - "accessorKey":"2_kvartal_2026_fakt_rsbu_iyun_26", - "columns":[ + header: "Факт РСБУ июнь 26", + accessorKey: "2_kvartal_2026_fakt_rsbu_iyun_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.actual_m3", - "columnLetter":"ED", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.actual_m3", + columnLetter: "ED", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Факт РСБУ 2 кв 26", - "accessorKey":"2_kvartal_2026_fakt_rsbu_2_kv_26", - "columns":[ + header: "Факт РСБУ 2 кв 26", + accessorKey: "2_kvartal_2026_fakt_rsbu_2_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.actual_quarter", - "columnLetter":"EE", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.actual_quarter", + columnLetter: "EE", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Остаток после брони 2 кв. 26", - "accessorKey":"2_kvartal_2026_ostatok_posle_broni_2_kv_26", - "columns":[ + header: "Остаток после брони 2 кв. 26", + accessorKey: "2_kvartal_2026_ostatok_posle_broni_2_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.rem_booking", - "columnLetter":"EF", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.rem_booking", + columnLetter: "EF", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FABF8F", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FABF8F", + color: "#000000", + }, + }, }, { - "header":"Остаток после факта 2 кв. 26", - "accessorKey":"2_kvartal_2026_ostatok_posle_fakta_2_kv_26", - "columns":[ + header: "Остаток после факта 2 кв. 26", + accessorKey: "2_kvartal_2026_ostatok_posle_fakta_2_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q2.rem_actual", - "columnLetter":"EG", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q2.rem_actual", + columnLetter: "EG", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Закрытие 2-го квартала", - "accessorKey":"2_kvartal_2026_zakrytie_2_go_kvartala", - "columns":[ + header: "Закрытие 2-го квартала", + accessorKey: "2_kvartal_2026_zakrytie_2_go_kvartala", + columns: [ { - "header":"Перенос в 3 кв.26", - "accessorKey":"data.q2.transfer_q3", - "columnLetter":"EI", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + header: "Перенос в 3 кв.26", + accessorKey: "data.q2.transfer_q3", + columnLetter: "EI", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Перенос в 4 кв.26", - "accessorKey":"data.q2.transfer_q4", - "columnLetter":"EJ", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + header: "Перенос в 4 кв.26", + accessorKey: "data.q2.transfer_q4", + columnLetter: "EJ", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Перенос в фонд экономии", - "accessorKey":"data.q2.economy", - "columnLetter":"EK", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + header: "Перенос в фонд экономии", + accessorKey: "data.q2.economy", + columnLetter: "EK", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"ВСЕГО", - "accessorKey":"data.q2.total", - "columnLetter":"EL", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } - } + header: "ВСЕГО", + accessorKey: "data.q2.total", + columnLetter: "EL", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { - "header":"3 квартал 2026", - "accessorKey":"3_kvartal_2026", - "columns":[ + header: "3 квартал 2026", + accessorKey: "3_kvartal_2026", + columns: [ { - "header":"Изменение целевого назначения перенесенной экономии ( =0)", - "accessorKey":"3_kvartal_2026_izmenenie_tselevogo_naznacheniya_perenesennoy_ekonomii_0", - "columns":[ + header: "Изменение целевого назначения перенесенной экономии ( =0)", + accessorKey: + "3_kvartal_2026_izmenenie_tselevogo_naznacheniya_perenesennoy_ekonomii_0", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.rev_eco", - "columnLetter":"EN", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.rev_eco", + columnLetter: "EN", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Корректировка статей базового плана ( =0)", - "accessorKey":"3_kvartal_2026_korrektirovka_statey_bazovogo_plana_0", - "columns":[ + header: "Корректировка статей базового плана ( =0)", + accessorKey: "3_kvartal_2026_korrektirovka_statey_bazovogo_plana_0", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.rev_item", - "columnLetter":"EO", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.rev_item", + columnLetter: "EO", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Увеличение базового плана( >0)", - "accessorKey":"3_kvartal_2026_uvelichenie_bazovogo_plana_0", - "columns":[ + header: "Увеличение базового плана( >0)", + accessorKey: "3_kvartal_2026_uvelichenie_bazovogo_plana_0", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.rev_inc", - "columnLetter":"EP", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.rev_inc", + columnLetter: "EP", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Cеквестр базового плана( <0)", - "accessorKey":"3_kvartal_2026_cekvestr_bazovogo_plana_0", - "columns":[ + header: "Cеквестр базового плана( <0)", + accessorKey: "3_kvartal_2026_cekvestr_bazovogo_plana_0", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.rev_seq", - "columnLetter":"EQ", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.rev_seq", + columnLetter: "EQ", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Комментарий", - "accessorKey":"3_kvartal_2026_kommentariy", - "columns":[ + header: "Комментарий", + accessorKey: "3_kvartal_2026_kommentariy", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.rev_comment", - "columnLetter":"ER", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.rev_comment", + columnLetter: "ER", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Новый план 3 кв 26", - "accessorKey":"3_kvartal_2026_novyy_plan_3_kv_26", - "columns":[ + header: "Новый план 3 кв 26", + accessorKey: "3_kvartal_2026_novyy_plan_3_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.new_plan", - "columnLetter":"ES", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.new_plan", + columnLetter: "ES", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"", - "accessorKey":"3_kvartal_2026_field", - "columns":[ + header: "", + accessorKey: "3_kvartal_2026_field", + columns: [ { - "header":"", - "accessorKey":"3_kvartal_2026_field_field", - "columnLetter":"ET", - "size":150, - "filterFn":"contains" - } + header: "", + accessorKey: "3_kvartal_2026_field_field", + columnLetter: "ET", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { - "header":"Текущие корректировки( = 0)", - "accessorKey":"3_kvartal_2026_tekuschie_korrektirovki_0", - "columns":[ + header: "Текущие корректировки( = 0)", + accessorKey: "3_kvartal_2026_tekuschie_korrektirovki_0", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.adj_current", - "columnLetter":"EU", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.adj_current", + columnLetter: "EU", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Корректировки с ССП / сметой развития", - "accessorKey":"3_kvartal_2026_korrektirovki_s_ssp_smetoy_razvitiya", - "columns":[ + header: "Корректировки с ССП / сметой развития", + accessorKey: "3_kvartal_2026_korrektirovki_s_ssp_smetoy_razvitiya", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.adj_ssp", - "columnLetter":"EV", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.adj_ssp", + columnLetter: "EV", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Корректировки с РФ", - "accessorKey":"3_kvartal_2026_korrektirovki_s_rf", - "columns":[ + header: "Корректировки с РФ", + accessorKey: "3_kvartal_2026_korrektirovki_s_rf", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.adj_rf", - "columnLetter":"EW", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.adj_rf", + columnLetter: "EW", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Корректировки из резерва", - "accessorKey":"3_kvartal_2026_korrektirovki_iz_rezerva", - "columns":[ + header: "Корректировки из резерва", + accessorKey: "3_kvartal_2026_korrektirovki_iz_rezerva", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.adj_reserve", - "columnLetter":"EX", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.adj_reserve", + columnLetter: "EX", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Перенос в 4 кв 26", - "accessorKey":"3_kvartal_2026_perenos_v_4_kv_26", - "columns":[ + header: "Перенос в 4 кв 26", + accessorKey: "3_kvartal_2026_perenos_v_4_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"3_kvartal_2026_perenos_v_4_kv_26_summa_tys_rub_bez_nds", - "columnLetter":"EY", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: + "3_kvartal_2026_perenos_v_4_kv_26_summa_tys_rub_bez_nds", + columnLetter: "EY", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Скорр. план 3 кв. 26", - "accessorKey":"3_kvartal_2026_skorr_plan_3_kv_26", - "columns":[ + header: "Скорр. план 3 кв. 26", + accessorKey: "3_kvartal_2026_skorr_plan_3_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.corrected_plan", - "columnLetter":"FA", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.corrected_plan", + columnLetter: "FA", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Платеж и предоставление акта", - "accessorKey":"3_kvartal_2026_platezh_i_predostavlenie_akta", - "columns":[ + header: "Платеж и предоставление акта", + accessorKey: "3_kvartal_2026_platezh_i_predostavlenie_akta", + columns: [ { - "header":"Дата платежа", - "accessorKey":"data.q3.pay_date", - "columnLetter":"FC", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "Дата платежа", + accessorKey: "data.q3.pay_date", + columnLetter: "FC", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.pay_amount", - "columnLetter":"FD", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.pay_amount", + columnLetter: "FD", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"в т.ч. сумма (без НДС) ГО", - "accessorKey":"data.q3.pay_ho", - "columnLetter":"FE", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "в т.ч. сумма (без НДС) ГО", + accessorKey: "data.q3.pay_ho", + columnLetter: "FE", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"в т.ч. сумма (без НДС) РФ", - "accessorKey":"data.q3.pay_rf", - "columnLetter":"FF", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "в т.ч. сумма (без НДС) РФ", + accessorKey: "data.q3.pay_rf", + columnLetter: "FF", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"Комментарий", - "accessorKey":"data.q3.pay_comment", - "columnLetter":"FG", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "Комментарий", + accessorKey: "data.q3.pay_comment", + columnLetter: "FG", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"Предоставление акта (др. подтверждения)", - "accessorKey":"data.q3.pay_act", - "columnLetter":"FH", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } - } + header: "Предоставление акта (др. подтверждения)", + accessorKey: "data.q3.pay_act", + columnLetter: "FH", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"Бронь 3 кв 26", - "accessorKey":"3_kvartal_2026_bron_3_kv_26", - "columns":[ + header: "Бронь 3 кв 26", + accessorKey: "3_kvartal_2026_bron_3_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.booking", - "columnLetter":"FJ", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.booking", + columnLetter: "FJ", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FABF8F", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FABF8F", + color: "#000000", + }, + }, }, { - "header":"Факт РСБУ июль 26", - "accessorKey":"3_kvartal_2026_fakt_rsbu_iyul_26", - "columns":[ + header: "Факт РСБУ июль 26", + accessorKey: "3_kvartal_2026_fakt_rsbu_iyul_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.actual_m1", - "columnLetter":"FK", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.actual_m1", + columnLetter: "FK", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Факт РСБУ август 26", - "accessorKey":"3_kvartal_2026_fakt_rsbu_avgust_26", - "columns":[ + header: "Факт РСБУ август 26", + accessorKey: "3_kvartal_2026_fakt_rsbu_avgust_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.actual_m2", - "columnLetter":"FL", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.actual_m2", + columnLetter: "FL", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Факт РСБУ сентябрь 26", - "accessorKey":"3_kvartal_2026_fakt_rsbu_sentyabr_26", - "columns":[ + header: "Факт РСБУ сентябрь 26", + accessorKey: "3_kvartal_2026_fakt_rsbu_sentyabr_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.actual_m3", - "columnLetter":"FM", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.actual_m3", + columnLetter: "FM", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Факт РСБУ 3 кв 26", - "accessorKey":"3_kvartal_2026_fakt_rsbu_3_kv_26", - "columns":[ + header: "Факт РСБУ 3 кв 26", + accessorKey: "3_kvartal_2026_fakt_rsbu_3_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.actual_quarter", - "columnLetter":"FN", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.actual_quarter", + columnLetter: "FN", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Остаток после брони 3 кв. 26", - "accessorKey":"3_kvartal_2026_ostatok_posle_broni_3_kv_26", - "columns":[ + header: "Остаток после брони 3 кв. 26", + accessorKey: "3_kvartal_2026_ostatok_posle_broni_3_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.rem_booking", - "columnLetter":"FO", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.rem_booking", + columnLetter: "FO", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FABF8F", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FABF8F", + color: "#000000", + }, + }, }, { - "header":"Остаток после факта 3 кв. 26", - "accessorKey":"3_kvartal_2026_ostatok_posle_fakta_3_kv_26", - "columns":[ + header: "Остаток после факта 3 кв. 26", + accessorKey: "3_kvartal_2026_ostatok_posle_fakta_3_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q3.rem_actual", - "columnLetter":"FP", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q3.rem_actual", + columnLetter: "FP", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Закрытие 3-го квартала", - "accessorKey":"3_kvartal_2026_zakrytie_3_go_kvartala", - "columns":[ + header: "Закрытие 3-го квартала", + accessorKey: "3_kvartal_2026_zakrytie_3_go_kvartala", + columns: [ { - "header":"Перенос в 4 кв.26", - "accessorKey":"data.q3.transfer_q4", - "columnLetter":"FR", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + header: "Перенос в 4 кв.26", + accessorKey: "data.q3.transfer_q4", + columnLetter: "FR", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Перенос в фонд экономии", - "accessorKey":"data.q3.economy", - "columnLetter":"FS", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + header: "Перенос в фонд экономии", + accessorKey: "data.q3.economy", + columnLetter: "FS", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"ВСЕГО", - "accessorKey":"data.q3.total", - "columnLetter":"FT", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } - } + header: "ВСЕГО", + accessorKey: "data.q3.total", + columnLetter: "FT", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { - "header":"4 квартал 2026", - "accessorKey":"4_kvartal_2026", - "columns":[ + header: "4 квартал 2026", + accessorKey: "4_kvartal_2026", + columns: [ { - "header":"Изменение целевого назначения перенесенной экономии ( =0)", - "accessorKey":"4_kvartal_2026_izmenenie_tselevogo_naznacheniya_perenesennoy_ekonomii_0", - "columns":[ + header: "Изменение целевого назначения перенесенной экономии ( =0)", + accessorKey: + "4_kvartal_2026_izmenenie_tselevogo_naznacheniya_perenesennoy_ekonomii_0", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.rev_eco", - "columnLetter":"FV", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.rev_eco", + columnLetter: "FV", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Корректировка статей базового плана ( =0)", - "accessorKey":"4_kvartal_2026_korrektirovka_statey_bazovogo_plana_0", - "columns":[ + header: "Корректировка статей базового плана ( =0)", + accessorKey: "4_kvartal_2026_korrektirovka_statey_bazovogo_plana_0", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.rev_item", - "columnLetter":"FW", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.rev_item", + columnLetter: "FW", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Увеличение базового плана( >0)", - "accessorKey":"4_kvartal_2026_uvelichenie_bazovogo_plana_0", - "columns":[ + header: "Увеличение базового плана( >0)", + accessorKey: "4_kvartal_2026_uvelichenie_bazovogo_plana_0", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.rev_inc", - "columnLetter":"FX", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.rev_inc", + columnLetter: "FX", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Cеквестр базового плана( <0)", - "accessorKey":"4_kvartal_2026_cekvestr_bazovogo_plana_0", - "columns":[ + header: "Cеквестр базового плана( <0)", + accessorKey: "4_kvartal_2026_cekvestr_bazovogo_plana_0", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.rev_seq", - "columnLetter":"FY", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.rev_seq", + columnLetter: "FY", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Комментарий", - "accessorKey":"4_kvartal_2026_kommentariy", - "columns":[ + header: "Комментарий", + accessorKey: "4_kvartal_2026_kommentariy", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.rev_comment", - "columnLetter":"FZ", - "size":150, - "filterFn":"contains" + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.rev_comment", + columnLetter: "FZ", + size: 150, + filterFn: "contains", }, { - "header":"Сумма, тыс руб. (без НДС)", - "accessorKey":"data.q4.adj_comment", - "columnLetter":"GG", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс руб. (без НДС)", + accessorKey: "data.q4.adj_comment", + columnLetter: "GG", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Новый план 4 кв 26", - "accessorKey":"4_kvartal_2026_novyy_plan_4_kv_26", - "columns":[ + header: "Новый план 4 кв 26", + accessorKey: "4_kvartal_2026_novyy_plan_4_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.new_plan", - "columnLetter":"GA", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.new_plan", + columnLetter: "GA", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"", - "accessorKey":"4_kvartal_2026_field", - "columns":[ + header: "", + accessorKey: "4_kvartal_2026_field", + columns: [ { - "header":"", - "accessorKey":"4_kvartal_2026_field_field", - "columnLetter":"GB", - "size":150, - "filterFn":"contains" - } + header: "", + accessorKey: "4_kvartal_2026_field_field", + columnLetter: "GB", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { - "header":"Текущие корректировки( = 0)", - "accessorKey":"4_kvartal_2026_tekuschie_korrektirovki_0", - "columns":[ + header: "Текущие корректировки( = 0)", + accessorKey: "4_kvartal_2026_tekuschie_korrektirovki_0", + columns: [ { - "header":"Сумма, тыс руб. (без НДС)", - "accessorKey":"data.q4.adj_current", - "columnLetter":"GC", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } - } + header: "Сумма, тыс руб. (без НДС)", + accessorKey: "data.q4.adj_current", + columnLetter: "GC", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Корректировки с ССП / сметой развития", - "accessorKey":"4_kvartal_2026_korrektirovki_s_ssp_smetoy_razvitiya", - "columns":[ + header: "Корректировки с ССП / сметой развития", + accessorKey: "4_kvartal_2026_korrektirovki_s_ssp_smetoy_razvitiya", + columns: [ { - "header":"Сумма, тыс руб. (без НДС)", - "accessorKey":"data.q4.adj_ssp", - "columnLetter":"GD", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс руб. (без НДС)", + accessorKey: "data.q4.adj_ssp", + columnLetter: "GD", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Корректировки с РФ", - "accessorKey":"4_kvartal_2026_korrektirovki_s_rf", - "columns":[ + header: "Корректировки с РФ", + accessorKey: "4_kvartal_2026_korrektirovki_s_rf", + columns: [ { - "header":"Сумма, тыс руб. (без НДС)", - "accessorKey":"data.q4.adj_rf", - "columnLetter":"GE", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс руб. (без НДС)", + accessorKey: "data.q4.adj_rf", + columnLetter: "GE", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Корректировки из резерва", - "accessorKey":"4_kvartal_2026_korrektirovki_iz_rezerva", - "columns":[ + header: "Корректировки из резерва", + accessorKey: "4_kvartal_2026_korrektirovki_iz_rezerva", + columns: [ { - "header":"Сумма, тыс руб. (без НДС)", - "accessorKey":"data.q4.adj_reserve", - "columnLetter":"GF", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс руб. (без НДС)", + accessorKey: "data.q4.adj_reserve", + columnLetter: "GF", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Скорр. план 4 кв. 26", - "accessorKey":"4_kvartal_2026_skorr_plan_4_kv_26", - "columns":[ + header: "Скорр. план 4 кв. 26", + accessorKey: "4_kvartal_2026_skorr_plan_4_kv_26", + columns: [ { - "header":"Сумма, тыс руб. (без НДС)", - "accessorKey":"data.q4.corrected_plan", - "columnLetter":"GH", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс руб. (без НДС)", + accessorKey: "data.q4.corrected_plan", + columnLetter: "GH", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFF66", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFF66", + color: "#000000", + }, + }, }, { - "header":"Платеж и предоставление акта", - "accessorKey":"4_kvartal_2026_platezh_i_predostavlenie_akta", - "columns":[ + header: "Платеж и предоставление акта", + accessorKey: "4_kvartal_2026_platezh_i_predostavlenie_akta", + columns: [ { - "header":"Дата платежа", - "accessorKey":"data.q4.pay_date", - "columnLetter":"GJ", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "Дата платежа", + accessorKey: "data.q4.pay_date", + columnLetter: "GJ", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.pay_amount", - "columnLetter":"GK", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.pay_amount", + columnLetter: "GK", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"в т.ч. сумма (без НДС) ГО", - "accessorKey":"data.q4.pay_ho", - "columnLetter":"GL", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "в т.ч. сумма (без НДС) ГО", + accessorKey: "data.q4.pay_ho", + columnLetter: "GL", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"в т.ч. сумма (без НДС) РФ", - "accessorKey":"data.q4.pay_rf", - "columnLetter":"GM", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "в т.ч. сумма (без НДС) РФ", + accessorKey: "data.q4.pay_rf", + columnLetter: "GM", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"Комментарий", - "accessorKey":"data.q4.pay_comment", - "columnLetter":"GN", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + header: "Комментарий", + accessorKey: "data.q4.pay_comment", + columnLetter: "GN", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"Предоставление акта (др. подтверждения)", - "accessorKey":"data.q4.pay_act", - "columnLetter":"GO", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } - } + header: "Предоставление акта (др. подтверждения)", + accessorKey: "data.q4.pay_act", + columnLetter: "GO", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, }, { - "header":"Бронь 4 кв 26", - "accessorKey":"4_kvartal_2026_bron_4_kv_26", - "columns":[ + header: "Бронь 4 кв 26", + accessorKey: "4_kvartal_2026_bron_4_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.booking", - "columnLetter":"GQ", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.booking", + columnLetter: "GQ", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FABF8F", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FABF8F", + color: "#000000", + }, + }, }, { - "header":"Факт РСБУ октябрь 26", - "accessorKey":"4_kvartal_2026_fakt_rsbu_oktyabr_26", - "columns":[ + header: "Факт РСБУ октябрь 26", + accessorKey: "4_kvartal_2026_fakt_rsbu_oktyabr_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.actual_m1", - "columnLetter":"GR", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.actual_m1", + columnLetter: "GR", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Факт РСБУ ноябрь 26", - "accessorKey":"4_kvartal_2026_fakt_rsbu_noyabr_26", - "columns":[ + header: "Факт РСБУ ноябрь 26", + accessorKey: "4_kvartal_2026_fakt_rsbu_noyabr_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.actual_m2", - "columnLetter":"GS", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.actual_m2", + columnLetter: "GS", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Факт РСБУ декабрь 26", - "accessorKey":"4_kvartal_2026_fakt_rsbu_dekabr_26", - "columns":[ + header: "Факт РСБУ декабрь 26", + accessorKey: "4_kvartal_2026_fakt_rsbu_dekabr_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.actual_m3", - "columnLetter":"GT", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.actual_m3", + columnLetter: "GT", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Факт РСБУ 4 кв 26", - "accessorKey":"4_kvartal_2026_fakt_rsbu_4_kv_26", - "columns":[ + header: "Факт РСБУ 4 кв 26", + accessorKey: "4_kvartal_2026_fakt_rsbu_4_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.actual_quarter", - "columnLetter":"GU", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.actual_quarter", + columnLetter: "GU", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Факт СПОД", - "accessorKey":"4_kvartal_2026_fakt_spod", - "columns":[ + header: "Факт СПОД", + accessorKey: "4_kvartal_2026_fakt_spod", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.actual_spod", - "columnLetter":"GV", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.actual_spod", + columnLetter: "GV", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Остаток после брони 4 кв. 26", - "accessorKey":"4_kvartal_2026_ostatok_posle_broni_4_kv_26", - "columns":[ + header: "Остаток после брони 4 кв. 26", + accessorKey: "4_kvartal_2026_ostatok_posle_broni_4_kv_26", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.rem_booking", - "columnLetter":"GW", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.rem_booking", + columnLetter: "GW", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FABF8F", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FABF8F", + color: "#000000", + }, + }, }, { - "header":"Остаток после факта 4 кв. 26 и СПОДов", - "accessorKey":"4_kvartal_2026_ostatok_posle_fakta_4_kv_26_i_spodov", - "columns":[ + header: "Остаток после факта 4 кв. 26 и СПОДов", + accessorKey: "4_kvartal_2026_ostatok_posle_fakta_4_kv_26_i_spodov", + columns: [ { - "header":"Сумма, тыс. руб. (без НДС)", - "accessorKey":"data.q4.rem_actual", - "columnLetter":"GX", - "size":150, - "filterFn":"contains" - } + header: "Сумма, тыс. руб. (без НДС)", + accessorKey: "data.q4.rem_actual", + columnLetter: "GX", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"Закрытие 4-го квартала", - "accessorKey":"4_kvartal_2026_zakrytie_4_go_kvartala", - "columns":[ + header: "Закрытие 4-го квартала", + accessorKey: "4_kvartal_2026_zakrytie_4_go_kvartala", + columns: [ { - "header":"", - "accessorKey":"4_kvartal_2026_zakrytie_4_go_kvartala_field", - "columnLetter":"GZ", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + header: "", + accessorKey: "4_kvartal_2026_zakrytie_4_go_kvartala_field", + columnLetter: "GZ", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"Перенос в фонд экономии", - "accessorKey":"data.q4.economy", - "columnLetter":"HA", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } + header: "Перенос в фонд экономии", + accessorKey: "data.q4.economy", + columnLetter: "HA", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, }, { - "header":"ВСЕГО", - "accessorKey":"data.q4.total", - "columnLetter":"HB", - "size":150, - "filterFn":"contains", - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } - } + header: "ВСЕГО", + accessorKey: "data.q4.total", + columnLetter: "HB", + size: 150, + filterFn: "contains", + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#903C39", - "color":"#FFFFFF" - } - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#903C39", + color: "#FFFFFF", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { - "header":"Факт", - "accessorKey":"fakt", - "columns":[ + header: "Факт", + accessorKey: "fakt", + columns: [ { - "header":"Факт 26", - "accessorKey":"fakt_fakt_26", - "columns":[ + header: "Факт 26", + accessorKey: "fakt_fakt_26", + columns: [ { - "header":"Факт 26", - "accessorKey":"data.totals.fact_year", - "columnLetter":"HE", - "size":150, - "filterFn":"contains" - } + header: "Факт 26", + accessorKey: "data.totals.fact_year", + columnLetter: "HE", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#C2D69B", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#C2D69B", + color: "#000000", + }, + }, }, { - "header":"", - "accessorKey":"fakt_field", - "columns":[ + header: "", + accessorKey: "fakt_field", + columns: [ { - "header":"", - "accessorKey":"fakt_field_field", - "columnLetter":"HF", - "size":150, - "filterFn":"contains" - } + header: "", + accessorKey: "fakt_field_field", + columnLetter: "HF", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, }, { - "header":"Сумма оплаты", - "accessorKey":"fakt_summa_oplaty", - "columns":[ + header: "Сумма оплаты", + accessorKey: "fakt_summa_oplaty", + columns: [ { - "header":"Сумма оплаты", - "accessorKey":"data.totals.pay_year", - "columnLetter":"HG", - "size":150, - "filterFn":"contains" - } + header: "Сумма оплаты", + accessorKey: "data.totals.pay_year", + columnLetter: "HG", + size: 150, + filterFn: "contains", + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#95B3D7", - "color":"#000000" - } - } - } + muiTableHeadCellProps: { + sx: { + backgroundColor: "#95B3D7", + color: "#000000", + }, + }, + }, ], - "muiTableHeadCellProps":{ - "sx":{ - "backgroundColor":"#FFFFFF", - "color":"#000000" - } - } - } - ] - } -} \ No newline at end of file + muiTableHeadCellProps: { + sx: { + backgroundColor: "#FFFFFF", + color: "#000000", + }, + }, + }, + ], + }, +}; diff --git a/web/src/components/RealtimeTable/contexts/RealtimeContext.js b/web/src/components/RealtimeTable/contexts/RealtimeContext.js index b7bd552..4dcd5b5 100644 --- a/web/src/components/RealtimeTable/contexts/RealtimeContext.js +++ b/web/src/components/RealtimeTable/contexts/RealtimeContext.js @@ -57,7 +57,7 @@ export const RealtimeProvider = ({ case "row_deleted": if (data.result && onRowDeleteRef.current) { - onRowDeleteRef.current(data.result); + onRowDeleteRef.current(data); } break; @@ -194,6 +194,9 @@ export const RealtimeProvider = ({ const message = { event: "row_deleted", data: { row_id: rowId }, + sheet: sheetName, + form_id: formId, + direction: direction, }; return sendMessage(message); diff --git a/web/src/components/RealtimeTable/hooks/useRealtimeData.js b/web/src/components/RealtimeTable/hooks/useRealtimeData.js index efa64df..247b449 100644 --- a/web/src/components/RealtimeTable/hooks/useRealtimeData.js +++ b/web/src/components/RealtimeTable/hooks/useRealtimeData.js @@ -1,7 +1,7 @@ import { useState, useEffect, useCallback, useRef } from "react"; import { FormsSheetApi } from "../../../api/form_sheet"; import { useRealtime } from "../contexts/RealtimeContext"; -import { insertCell, updateCells } from "../utils/cellUtils"; +import { deleteRow, insertCell, updateCells } from "../utils/cellUtils"; const useRealtimeData = (formId, sheetName, direction) => { const [data, setData] = useState([]); @@ -86,15 +86,8 @@ const useRealtimeData = (formId, sheetName, direction) => { return; } - const maxDepth = data.reduce( - (prev, current) => { - return (prev.depth || 0) > (current.depth || 0) ? prev : current; - }, - { depth: 0 }, - ).depth; - - const formattedData = formatedToSubRows(maxDepth, data); - setData(formattedData); + const hierarchicalData = buildHierarchy(data); + setData(hierarchicalData); } catch (err) { console.error("Failed to load initial data:", err); setError(err.message); @@ -104,7 +97,54 @@ const useRealtimeData = (formId, sheetName, direction) => { }; loadInitialData(); - }, [formId, sheetName, formatedToSubRows]); + }, [formId, sheetName]); + + const buildHierarchy = (items) => { + const result = []; + const stack = []; + + const getTypeLevel = (type) => { + const levels = { + ROOT: 0, + GROUP: 1, + ITEM: 2, + SUB_ITEM: 3, + INPUT: 4, + }; + return levels[type] ?? 999; + }; + + for (const item of items) { + const currentLevel = getTypeLevel(item.row_type); + + while ( + stack.length > 0 && + getTypeLevel(stack[stack.length - 1].row_type) >= currentLevel + ) { + stack.pop(); + } + + const parent = stack.length > 0 ? stack[stack.length - 1] : null; + + const newNode = { ...item, subRows: [] }; + + if (parent) { + if (!parent.subRows) { + parent.subRows = []; + } + parent.subRows.push(newNode); + } else { + result.push(newNode); + } + + // Добавляем текущий узел в стек, если он может иметь детей + if (item.row_type !== "INPUT") { + stack.push(newNode); + } + } + + return result; + }; useEffect(() => { setIsConnected(wsConnected); @@ -132,34 +172,35 @@ const useRealtimeData = (formId, sheetName, direction) => { }); const unsubscribeRowAdds = subscribeToRowAdds((data) => { - const updates = data.result; + const updates = data.result.data; const expense_item_id = data.data.expense_item_id; - const updatedCells = updates.slice(0, -1); - const newRow = updates.at(-1); + const newLineId = data.result.new_line_id; + const [updatedCells, newRow] = updates.reduce( + (res, row) => { + if (row[3]?.line_id === newLineId) { + res[1] = row; + } else { + res[0].push(row); + } + return res; + }, + [[], null], + ); setData((prevData) => { const updateData = updateCells(prevData, updatedCells); - const newData = insertCell(updateData, newRow, expense_item_id); - console.log(newData) return newData; }); }); - const unsubscribeRowDeletes = subscribeToRowDeletes((deletedRowId) => { + const unsubscribeRowDeletes = subscribeToRowDeletes((data) => { + const updatedCells = data.result; + const lineIdForDelete = data.data.row_id; setData((prevData) => { - // Функция для удаления строки из иерархии - const deleteInHierarchy = (items) => { - return items - .filter((item) => (item.id || item.line_id) !== deletedRowId) - .map((item) => { - if (item.subRows && item.subRows.length > 0) { - return { ...item, subRows: deleteInHierarchy(item.subRows) }; - } - return item; - }); - }; - - return deleteInHierarchy(prevData); + const updateData = updateCells(prevData, updatedCells); + const newData = deleteRow(updateData, lineIdForDelete); + console.log(newData); + return newData; }); }); diff --git a/web/src/components/RealtimeTable/tableColumns.jsx b/web/src/components/RealtimeTable/tableColumns.jsx index d6fc397..8c9af2a 100644 --- a/web/src/components/RealtimeTable/tableColumns.jsx +++ b/web/src/components/RealtimeTable/tableColumns.jsx @@ -9,7 +9,8 @@ function EditCellPortal({ EditCell, onSaveStart, onSaveEnd, - onError + onError, + isEditable }) { const ref = useRef(null); const [refTbody, setRefTbody] = useState(false); @@ -25,17 +26,7 @@ function EditCellPortal({ const handleChange = async (val) => { table.setEditingCell(null); - if (isSaving) return; - - setIsSaving(true); - onSaveStart?.(); - - // Сохраняем старое значение на случай ошибки - const oldValue = cell.getValue(); - try { - - // Используем updateCell из контекста (передается через meta) if (table.options.meta?.updateCell) { const success = await table.options.meta.updateCell( cell.row, @@ -44,32 +35,15 @@ function EditCellPortal({ ); if (success) { console.log('Cell updated successfully via WebSocket'); - onSaveEnd?.(true); - table.setEditingCell(null); } else { console.error('Failed to update cell via WebSocket'); const errorMsg = 'Не удалось сохранить изменение'; onError?.(errorMsg); - onSaveEnd?.(false); - // Возвращаем предыдущее значение - } - } else { - // Если updateCell нет в meta, используем onCellUpdate из пропсов (fallback) - console.warn('WebSocket updateCell not configured in meta'); - if (table.options.meta?.onCellUpdate) { - table.options.meta.onCellUpdate(cell.row.id, cell.column.id, val); - } - onSaveEnd?.(true); - table.setEditingCell(null); - } + } } catch (error) { console.error('Error updating cell:', error); onError?.(error.message); - onSaveEnd?.(false); - - } finally { - setIsSaving(false); } }; @@ -88,7 +62,7 @@ function EditCellPortal({ refCell={ref} cell={cell} value={cell.getValue()} - disabled={isDisabled || isSaving} + disabled={!isEditable} onChange={handleChange} />, refTbody, @@ -131,8 +105,9 @@ export const getTableColumns = ({ column={column} cell={cell} globalFilter={ - table.getState().globalFilter || column.getFilterValue() + table.getState().globalFilter } + isEditable={row.original?.row_type === 'INPUT' || false} backgroundColor={columnColors[column.id]?.color_type?.[row.original?.row_type || row.row_type]} color={columnColors[column.id]?.color_type?.['COLOR']} isUpdating={table.options.meta?.updatingCells?.[`${row.id}_${column.id}`]} @@ -144,20 +119,8 @@ export const getTableColumns = ({ cell={cell} table={table} EditCell={EditCell} - onSaveStart={() => { - if (table.options.meta?.setUpdatingCell) { - table.options.meta.setUpdatingCell(row.id, column.id, true); - } - }} - onSaveEnd={(success) => { - if (table.options.meta?.setUpdatingCell) { - table.options.meta.setUpdatingCell(row.id, column.id, false); - } - if (!success && onCellUpdateError) { - onCellUpdateError(row.id, column.id, 'Failed to save'); - } - }} onError={onCellUpdateError} + isEditable={row.original?.row_type === 'INPUT' || false} /> ); @@ -177,10 +140,9 @@ export const getTableColumns = ({ enableEditing: false, enablePinning: true, Cell: ({ cell, row }) => { - return {console.log('TEST', row.id); onCellNumberClick(row.id)}} - >{cell.getValue()}; + return }, }; diff --git a/web/src/components/RealtimeTable/utils/cellUtils.js b/web/src/components/RealtimeTable/utils/cellUtils.js index 1f948e5..509286a 100644 --- a/web/src/components/RealtimeTable/utils/cellUtils.js +++ b/web/src/components/RealtimeTable/utils/cellUtils.js @@ -1,5 +1,4 @@ export function setNewValueToData(data, colId, rowId, value) { - // 1. Находим целевой объект по rowId(индексы вложенных subRows) let targetObject = data; if (rowId && rowId.length) { const indices = rowId.split(".").map(Number); @@ -71,7 +70,7 @@ export function updateCells(data, newRows) { } }); } - return true; // Нашли и обновили + return true; } if ( @@ -125,3 +124,26 @@ export function insertCell(data, newRow, expense_item_id) { findAndUpdate(updatedRows); return updatedRows; } + +export function deleteRow(data, lineId) { + const updatedRows = JSON.parse(JSON.stringify(data)); + + function findAndDelete(rows) { + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + + if (row.data.line_id == lineId) { + rows.splice(i, 1); + return true; + } + + if (row.subRows && Array.isArray(row.subRows) && row.subRows.length > 0) { + const found = findAndDelete(row.subRows); + if (found) return true; + } + } + return false; + } + findAndDelete(updatedRows); + return updatedRows; +} diff --git a/web/src/components/common/TableCard/TableCard.jsx b/web/src/components/common/TableCard/TableCard.jsx index fa12a9d..d5e4223 100644 --- a/web/src/components/common/TableCard/TableCard.jsx +++ b/web/src/components/common/TableCard/TableCard.jsx @@ -14,7 +14,7 @@ const TableCard = ({ table, onNavigate }) => { }; return ( -
+
diff --git a/web/src/components/common/TableList/TableList.jsx b/web/src/components/common/TableList/TableList.jsx index 28be971..e0afa57 100644 --- a/web/src/components/common/TableList/TableList.jsx +++ b/web/src/components/common/TableList/TableList.jsx @@ -26,7 +26,7 @@ const TablesList = ({ return ( handleNavigate(path)} table={table} />