Выдение ячеек по клику
This commit is contained in:
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user