fix(grid): focus cell before detail

This commit is contained in:
t8y2 2026-05-22 19:02:08 +08:00
parent a26a762b8c
commit c2a13f3057
2 changed files with 20 additions and 1 deletions

View File

@ -2234,6 +2234,12 @@ function showCellDetails(rowIndex: number, colIndex: number) {
showCellDetail.value = true;
}
function showCellDetailsForVisibleCell(rowIndex: number, visibleColIdx: number, actualColIdx: number) {
clearRowSelection();
selectSingleCell(rowIndex, visibleColIdx);
showCellDetails(rowIndex, actualColIdx);
}
watch([selectedRange, showCellDetail, isEditingDetail], () => {
const selectedCell = currentSelectedCellPosition();
const target = linkedCellDetailTarget({
@ -4105,7 +4111,7 @@ defineExpose({
class="absolute right-0.5 top-0.5 flex h-5 w-5 items-center justify-center rounded bg-background/90 text-muted-foreground shadow-sm ring-1 ring-border hover:text-foreground"
:title="t('grid.cellDetails')"
@mousedown.stop
@click.stop="showCellDetails(index, actualColIdx)"
@click.stop="showCellDetailsForVisibleCell(index, visibleColIdx, actualColIdx)"
>
<Info class="h-3 w-3" />
</button>

View File

@ -1,3 +1,4 @@
import { readFileSync } from "node:fs";
import { strict as assert } from "node:assert";
import test from "node:test";
import {
@ -76,3 +77,15 @@ test("cell detail does not follow selection while closed or editing", () => {
assert.equal(linkedCellDetailTarget({ isOpen: true, isEditing: true, selectedCell, actualColumnIndex }), null);
assert.equal(linkedCellDetailTarget({ isOpen: true, isEditing: false, selectedCell: null, actualColumnIndex }), null);
});
test("cell detail action focuses the hovered cell before opening details", () => {
const source = readFileSync("apps/desktop/src/components/grid/DataGrid.vue", "utf8");
assert.match(
source,
/function showCellDetailsForVisibleCell\(rowIndex: number, visibleColIdx: number, actualColIdx: number\)/,
);
assert.match(source, /selectSingleCell\(rowIndex, visibleColIdx\)/);
assert.match(source, /@click\.stop="showCellDetailsForVisibleCell\(index, visibleColIdx, actualColIdx\)"/);
assert.doesNotMatch(source, /@click\.stop="showCellDetails\(index, actualColIdx\)"/);
});