Выдение ячеек по клику

This commit is contained in:
2025-07-22 05:55:43 +03:00
parent faad68cdc0
commit 1b17638565
6 changed files with 215 additions and 9 deletions

View File

@@ -19,6 +19,8 @@ import {
} from './types'
import {
convertReferencesToHighlights,
createCellAddress,
createQualifiedCellReference,
extractCellReferences,
getColumnLabel,
} from './utils'
@@ -67,6 +69,8 @@ const DualSpreadsheet: FC<DualSpreadsheetProps> = ({
} | null>(null)
const [isEditing, setIsEditing] = useState(false)
const [editingValue, setEditingValue] = useState<string>('') // Локальное значение во время редактирования
// Источник ввода: 'cell' (редактирование внутри ячейки) или 'formula'
const [editingSource, setEditingSource] = useState<'cell' | 'formula'>('cell')
const [isInitialized, setIsInitialized] = useState(false)
const [baseFileData, setBaseFileData] = useState<
Record<string, Record<string, any>>
@@ -427,6 +431,7 @@ const DualSpreadsheet: FC<DualSpreadsheetProps> = ({
}
setIsEditing(false)
setEditingValue('')
setEditingSource('cell')
containerRefs.current[activeSheet]?.focus({ preventScroll: true })
},
[activeSheet, selectedCell, editingValue, multiSheetEngine, updateRevision]
@@ -497,8 +502,14 @@ const DualSpreadsheet: FC<DualSpreadsheetProps> = ({
ArrowDown: () => moveSelection(1, 0),
ArrowLeft: () => moveSelection(0, -1),
ArrowRight: () => moveSelection(0, 1),
Enter: () => startEditing(),
F2: () => startEditing(),
Enter: () => {
setEditingSource('cell')
startEditing()
},
F2: () => {
setEditingSource('cell')
startEditing()
},
Delete: handleClearCell,
Backspace: handleClearCell,
}
@@ -508,6 +519,7 @@ const DualSpreadsheet: FC<DualSpreadsheetProps> = ({
keyHandlers[e.key]()
} else if (e.key.length === 1 && !e.ctrlKey && !e.metaKey) {
e.preventDefault()
setEditingSource('cell')
setEditingValue(e.key)
setIsEditing(true)
}
@@ -517,6 +529,13 @@ const DualSpreadsheet: FC<DualSpreadsheetProps> = ({
const handleCellClick = useCallback(
(row: number, col: number) => {
console.log('🖱️ Обычный клик по ячейке:', {
row,
col,
isEditing,
activeSheet,
})
if (isEditing) {
stopEditing(true)
}
@@ -526,9 +545,71 @@ const DualSpreadsheet: FC<DualSpreadsheetProps> = ({
[isEditing, stopEditing, activeSheet]
)
// Новый обработчик для кликов в режиме редактирования - вставляет ссылку
const handleCellReferenceClick = useCallback(
(targetSheetType: SheetType, row: number, col: number) => {
console.log('🔗 Клик для вставки ссылки:', {
targetSheetType,
row,
col,
isEditing,
selectedCell,
editingValue,
})
// Проверяем, что мы в режиме редактирования
if (!isEditing || !selectedCell) {
console.log(
'⚠️ Игнорируем клик ссылки: не в режиме редактирования или нет выбранной ячейки'
)
return
}
// Создаем ссылку на ячейку
let cellReference: string
// Если это другой лист, делаем квалифицированную ссылку
if (targetSheetType !== activeSheet) {
cellReference = createQualifiedCellReference(targetSheetType, row, col)
console.log('📋 Создана межлистовая ссылка:', cellReference)
} else {
// Если это тот же лист, делаем локальную ссылку
cellReference = createCellAddress(row, col)
console.log('📋 Создана локальная ссылка:', cellReference)
}
// Добавляем ссылку к текущему значению редактирования
const newValue = editingValue + cellReference
console.log('✏️ Новое значение формулы:', {
oldValue: editingValue,
newValue,
})
setEditingValue(newValue)
if (editingSource === 'formula') {
if (formulaBarRef.current) {
formulaBarRef.current.value = newValue
formulaBarRef.current.focus()
const length = newValue.length
formulaBarRef.current.setSelectionRange(length, length)
}
} else {
if (activeCellInputRef.current) {
activeCellInputRef.current.value = newValue
activeCellInputRef.current.focus({ preventScroll: true })
const length = newValue.length
activeCellInputRef.current.setSelectionRange(length, length)
}
}
},
[isEditing, selectedCell, editingValue, activeSheet, editingSource]
)
const handleCellDoubleClick = useCallback(
(row: number, col: number) => {
setSelectedCell({ row, col })
setEditingSource('cell')
startEditing()
},
[startEditing]
@@ -563,6 +644,7 @@ const DualSpreadsheet: FC<DualSpreadsheetProps> = ({
const handleFormulaBarFocus = useCallback(() => {
if (selectedCell && !isEditing) {
setEditingSource('formula')
startEditing()
}
}, [selectedCell, isEditing, startEditing])
@@ -864,6 +946,8 @@ const DualSpreadsheet: FC<DualSpreadsheetProps> = ({
handleCellClick={handleCellClick}
handleCellDoubleClick={handleCellDoubleClick}
handleCellChange={handleCellChange}
handleCellReferenceClick={handleCellReferenceClick}
isInEditMode={isEditing}
stopEditing={stopEditing}
setActiveSheet={setActiveSheet}
activeCellInputRef={activeCellInputRef}