import { Save, Sigma } from 'lucide-react' import { memo } from 'react' import { ExcelUploadPanel } from '../../TemplateManager/ExcelUploadPanel' import { FormulaBarProps } from '../types' import { getColumnLabel } from '../utils' export const FormulaBar = memo( ({ selectedCell, formulaBarValue, isCalculating, isEditing, onValueChange, onFocus, onBlur, onKeyDown, formulaBarRef, isSaving = false, isLoading = false, hasUnsavedChanges = false, lastSaveError = null, onManualSave, onClearError, excelFileName, isExcelLoading = false, onExcelFileChange, }: Omit) => { return (
{/* Адрес ячейки */}
{selectedCell ? `${getColumnLabel(selectedCell.col)}${selectedCell.row + 1}` : 'A1'}
{/* Строка формул */}
onValueChange(e.target.value)} onFocus={onFocus} onBlur={e => { const relatedTarget = e.relatedTarget as HTMLElement if ( relatedTarget && relatedTarget.closest('input[type="text"]') ) { return } onBlur(e) }} onKeyDown={onKeyDown} onMouseDown={e => { // Если поле не в режиме редактирования, нужно запустить редактирование // но сохранить позицию курсора if (!isEditing) { // Вычисляем позицию клика вручную const input = e.currentTarget const rect = input.getBoundingClientRect() const clickX = e.clientX - rect.left - parseInt(getComputedStyle(input).paddingLeft) // Создаем временный range для определения позиции const tempSpan = document.createElement('span') tempSpan.textContent = input.value tempSpan.style.cssText = getComputedStyle(input).cssText tempSpan.style.position = 'absolute' tempSpan.style.visibility = 'hidden' tempSpan.style.whiteSpace = 'pre' document.body.appendChild(tempSpan) let position = 0 let bestDistance = Infinity for (let i = 0; i <= input.value.length; i++) { tempSpan.textContent = input.value.substring(0, i) const distance = Math.abs(tempSpan.offsetWidth - clickX) if (distance < bestDistance) { bestDistance = distance position = i } } document.body.removeChild(tempSpan) // Сохраняем вычисленную позицию в data-атрибуте input.dataset.clickPosition = position.toString() // Запускаем редактирование onFocus() } }} />
{/* Правая группа: индикаторы и действия */}
{/* Индикатор процесса */} {(isCalculating || isSaving || isLoading) && (
{isSaving ? 'Сохранение...' : isLoading ? 'Загрузка...' : 'Расчет...'}
)} {/* Ошибка сохранения */} {lastSaveError && (
Ошибка {onClearError && ( )}
)} {/* ExcelUploadPanel */} {onExcelFileChange && ( {}} onFileChange={onExcelFileChange} /> )} {/* Кнопка сохранения */} {onManualSave && ( )}
) } )