From c1b5e76a4306cc8f1d1e712af0dd6d6171c462dd Mon Sep 17 00:00:00 2001 From: mertmit Date: Sat, 24 Jun 2023 09:00:52 +0300 Subject: [PATCH] fix: snap fill handle Signed-off-by: mertmit --- .../nc-gui/components/smartsheet/Grid.vue | 498 +++++++++--------- 1 file changed, 237 insertions(+), 261 deletions(-) diff --git a/packages/nc-gui/components/smartsheet/Grid.vue b/packages/nc-gui/components/smartsheet/Grid.vue index c78af55d2e..a73fc6806e 100644 --- a/packages/nc-gui/components/smartsheet/Grid.vue +++ b/packages/nc-gui/components/smartsheet/Grid.vue @@ -2,7 +2,6 @@ import { nextTick } from '@vue/runtime-core' import type { ColumnReqType, ColumnType, GridType, PaginatedType, TableType, ViewType } from 'nocodb-sdk' import { UITypes, isSystemColumn, isVirtualCol } from 'nocodb-sdk' -import type { UseElementBoundingReturn } from '@vueuse/core' import { ActiveViewInj, CellUrlDisableOverlayInj, @@ -112,6 +111,8 @@ const tableHeadEl = ref() const tableBodyEl = ref() const fillHandle = ref() +const gridRect = useElementBounding(gridWrapper) + const isAddingColumnAllowed = $computed(() => !readOnly.value && !isLocked.value && isUIAllowed('add-column') && !isSqlView.value) const isAddingEmptyRowAllowed = $computed(() => !isView && !isLocked.value && hasEditPermission && !isSqlView.value) @@ -891,16 +892,19 @@ function addEmptyRow(row?: number) { return rowObj } -const tableRect = useElementBounding(smartTable) -const { height: tableHeight, width: tableWidth } = tableRect - -const { x: gridX, y: gridY } = useScroll(gridWrapper) - const fillHandleTop = ref() const fillHandleLeft = ref() const cellRefs = ref<{ el: HTMLElement }[]>([]) -let cellRect: UseElementBoundingReturn | null = null + +const showFillHandle = computed( + () => + !readOnly.value && + !isLocked.value && + !editEnabled && + (!selectedRange.isEmpty() || (activeCell.row !== null && activeCell.col !== null)) && + !data.value[selectedRange.end.row ?? activeCell.row]?.rowMeta?.new, +) const refreshFillHandle = () => { const cellRef = cellRefs.value.find( @@ -908,28 +912,22 @@ const refreshFillHandle = () => { cell.el.dataset.rowIndex === String(selectedRange.end.row) && cell.el.dataset.colIndex === String(selectedRange.end.col), ) if (cellRef) { - cellRect = useElementBounding(cellRef.el) - if (!cellRect || !tableRect) return - if (selectedRange.end.col === 0) { - fillHandleTop.value = cellRect.top.value - tableRect.top.value + cellRect.height.value + gridY.value - fillHandleLeft.value = cellRect.left.value - tableRect.left.value + cellRect.width.value - return - } - fillHandleTop.value = cellRect.top.value - tableRect.top.value + cellRect.height.value + gridY.value - fillHandleLeft.value = cellRect.left.value - tableRect.left.value + cellRect.width.value + gridX.value + const cellRect = useElementBounding(cellRef.el) + if (!cellRect || !gridWrapper.value) return + fillHandleTop.value = cellRect.top.value + cellRect.height.value - gridRect.top.value + gridWrapper.value.scrollTop + fillHandleLeft.value = cellRect.left.value + cellRect.width.value - gridRect.left.value + gridWrapper.value.scrollLeft } } -watch( - () => `${selectedRange.end.row}-${selectedRange.end.col}`, - (n, o) => { - if (n !== o) { - if (gridWrapper.value) { - refreshFillHandle() - } - } - }, -) +watch([() => selectedRange.end.row, () => selectedRange.end.col], (n, o) => { + if (n !== o) { + refreshFillHandle() + } +}) + +useEventListener(gridWrapper, 'scroll', () => { + refreshFillHandle() +}) + + + + +
+ +
+ + + + + + + +
+
-
- -
-