Browse Source

fix: improved mouse event handlers

Signed-off-by: mertmit <mertmit99@gmail.com>
pull/5918/head
mertmit 1 year ago
parent
commit
3c2504ef1e
  1. 2
      packages/nc-gui/components/smartsheet/Grid.vue
  2. 65
      packages/nc-gui/composables/useMultiSelect/index.ts

2
packages/nc-gui/components/smartsheet/Grid.vue

@ -1046,7 +1046,7 @@ function addEmptyRow(row?: number) {
:data-col="columnObj.id"
:data-title="columnObj.title"
@mousedown="handleMouseDown($event, rowIndex, colIndex)"
@mouseover="handleMouseOver(rowIndex, colIndex)"
@mouseover="handleMouseOver($event, rowIndex, colIndex)"
@click="handleCellClick($event, rowIndex, colIndex)"
@dblclick="makeEditable(row, columnObj)"
@contextmenu="showContextMenu($event, { row: rowIndex, col: colIndex })"

65
packages/nc-gui/composables/useMultiSelect/index.ts

@ -212,13 +212,6 @@ export function useMultiSelect(
}
}
function handleMouseOver(row: number, col: number) {
if (!isMouseDown) {
return
}
selectedRange.endRange({ row, col })
}
function isCellSelected(row: number, col: number) {
if (activeCell.col === col && activeCell.row === row) {
return true
@ -236,6 +229,19 @@ export function useMultiSelect(
)
}
function handleMouseOver(event: MouseEvent, row: number, col: number) {
if (!isMouseDown) {
return
}
// extend the selection and scroll to the cell
selectedRange.endRange({ row, col })
scrollToCell?.(row, col)
// avoid selecting text
event.preventDefault()
}
function handleMouseDown(event: MouseEvent, row: number, col: number) {
// if there was a right click on selected range, don't restart the selection
if (
@ -245,13 +251,26 @@ export function useMultiSelect(
return
}
isMouseDown = true
// if edit is enabled, don't start the selection (some cells shrink after edit mode, which causes the selection to expand if flag is set)
if (!editEnabled.value) isMouseDown = true
contextMenu.value = false
// if shift key is pressed, don't restart the selection
if (event.shiftKey) return
// avoid text selection
event.preventDefault()
// if shift key is pressed, extend the selection
if (event.shiftKey) {
// if shift key is pressed, don't restart the selection (unless there is no active cell)
if (activeCell.col === null || activeCell.row === null) {
selectedRange.startRange({ row, col })
}
selectedRange.endRange({ row, col })
return
}
// start a new selection
selectedRange.startRange({ row, col })
if (activeCell.row !== row || activeCell.col !== col) {
@ -262,42 +281,26 @@ export function useMultiSelect(
}
const handleCellClick = (event: MouseEvent, row: number, col: number) => {
isMouseDown = true
// if shift key is pressed, prevent selecting text
if (event.shiftKey && !unref(editEnabled)) {
event.preventDefault()
}
// if shift key is pressed, don't restart the selection (unless there is no active cell)
// if shift key is pressed, don't change the active cell (unless there is no active cell)
if (!event.shiftKey || activeCell.col === null || activeCell.row === null) {
selectedRange.startRange({ row, col })
makeActive(row, col)
}
selectedRange.endRange({ row, col })
scrollToCell?.(row, col)
isMouseDown = false
}
const handleMouseUp = (event: MouseEvent) => {
const handleMouseUp = (_event: MouseEvent) => {
if (isMouseDown) {
isMouseDown = false
// timeout is needed, because we want to set cell as active AFTER all the child's click handler's called
// this is needed e.g. for date field edit, where two clicks had to be done - one to select cell, and another one to open date dropdown
setTimeout(() => {
// if shift key is pressed, don't change the active cell
if (event.shiftKey) return
if (selectedRange._start) {
makeActive(selectedRange._start.row, selectedRange._start.col)
if (activeCell.row !== selectedRange._start.row || activeCell.col !== selectedRange._start.col) {
makeActive(selectedRange._start.row, selectedRange._start.col)
}
}
}, 0)
// if the editEnabled is false, prevent selecting text on mouseUp
if (!unref(editEnabled)) {
event.preventDefault()
}
}
}

Loading…
Cancel
Save