From bafae2ca580ad0b54130a892f2e5ed411166f601 Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Mon, 22 Jun 2026 13:33:32 +0300 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D1=83=D0=BB=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RealtimeTable/Cell/EditCell/EditCell.jsx | 103 +++++++++++++++++- .../RealtimeTable/RealtimeTable.jsx | 2 +- .../SettingPanel/SettingPanel.jsx | 6 +- .../RealtimeTable/hooks/useColumnSettings.js | 40 +++++-- .../components/RealtimeTable/tableColumns.jsx | 9 +- .../RealtimeTable/utils/formulaUtils.js | 92 ++++++++++++++++ 6 files changed, 229 insertions(+), 23 deletions(-) create mode 100644 web/src/components/RealtimeTable/utils/formulaUtils.js diff --git a/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx b/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx index 68a87d3..5a0687c 100644 --- a/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx +++ b/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx @@ -1,14 +1,41 @@ +// EditCell.js - обновленная версия import { useEffect, useRef, useLayoutEffect, useState } from 'react'; +import { isFormula, extractFormula, calculateFormula, formatNumber } from '../../utils/formulaUtils'; +import { saveToStorage, loadFromStorage } from '../../utils/localStorageUtils'; -const EditCell = ({ refCell, onChange, disabled, value }) => { +const EditCell = ({ refCell, onChange, disabled, value, tableId, cellId }) => { const [curValue, setCurValue] = useState(value); + const [displayValue, setDisplayValue] = useState(value); + const [isFormulaMode, setIsFormulaMode] = useState(false); + + // Ключ для хранения формул в localStorage + const storageKey = `formula_${tableId}_${cellId}`; + const trFrag = refCell.current.offsetParent.offsetParent; const tdFrag = refCell.current.offsetParent; const left = tdFrag.offsetLeft; const width = refCell.current.offsetParent.offsetWidth; - const translateY = trFrag.style.transform; + // Загружаем сохраненную формулу при монтировании + useEffect(() => { + const savedFormula = loadFromStorage(storageKey); + if (savedFormula && isFormula(savedFormula)) { + setIsFormulaMode(true); + setCurValue(savedFormula); + // Вычисляем и отображаем результат + try { + const formula = extractFormula(savedFormula); + const result = calculateFormula(formula); + setDisplayValue(formatNumber(result)); + } catch (error) { + setDisplayValue('#ОШИБКА'); + } + } else { + setDisplayValue(value); + } + }, [storageKey, value]); + function useAutoResize(value) { const ref = useRef(null); @@ -37,13 +64,48 @@ const EditCell = ({ refCell, onChange, disabled, value }) => { } }, [disabled, ref]); - const handleChange = () => { - onChange?.(curValue); + const handleSave = () => { + // Проверяем, является ли введенное значение формулой + if (isFormula(curValue)) { + // Сохраняем формулу в localStorage + saveToStorage(storageKey, curValue); + + // Вычисляем и сохраняем результат + try { + const formula = extractFormula(curValue); + const result = calculateFormula(formula); + const formattedResult = formatNumber(result); + setDisplayValue(formattedResult); + onChange?.(formattedResult); + setIsFormulaMode(true); + return; + } catch (error) { + setDisplayValue('#ОШИБКА'); + onChange?.(curValue); // Сохраняем как текст, если ошибка + return; + } + } else { + // Если это не формула, удаляем сохраненную формулу + localStorage.removeItem(storageKey); + setIsFormulaMode(false); + setDisplayValue(curValue); + onChange?.(curValue); + } }; const handleChangeValue = (event) => { const input = event.target.value; setCurValue(input); + // При редактировании показываем введенный текст + setDisplayValue(input); + }; + + // Функция для отображения значения в ячейке + const getDisplayValue = () => { + if (isFormulaMode && isFormula(curValue)) { + return displayValue; + } + return displayValue; }; return ( @@ -60,6 +122,21 @@ const EditCell = ({ refCell, onChange, disabled, value }) => { top: 0, }} > + {isFormulaMode && ( +
+ fx +
+ )}