feat(grid): link cell detail to selection

This commit is contained in:
t8y2
2026-05-22 01:41:30 +08:00
parent af5eb9cb2f
commit 612c6d36db
3 changed files with 55 additions and 0 deletions
@@ -106,6 +106,7 @@ import {
cellDetailEditorText,
defaultCellDetailTab,
formatJsonText,
linkedCellDetailTarget,
valueEditorActions,
visibleCellDetailTabs,
type CellDetailTab,
@@ -2192,6 +2193,18 @@ function showCellDetails(rowIndex: number, colIndex: number) {
showCellDetail.value = true;
}
watch([selectedRange, showCellDetail, isEditingDetail], () => {
const selectedCell = currentSelectedCellPosition();
const target = linkedCellDetailTarget({
isOpen: showCellDetail.value,
isEditing: isEditingDetail.value,
selectedCell: selectedCell ? { rowIndex: selectedCell.rowIndex, visibleColIndex: selectedCell.colIndex } : null,
actualColumnIndex,
});
if (!target) return;
detailCell.value = target;
});
function openImagePreview(src: string, title: string) {
imagePreviewSrc.value = src;
imagePreviewTitle.value = title;
@@ -5,6 +5,18 @@ export interface CellDetailPresentationOptions {
isEditable: boolean;
}
export interface LinkedCellDetailOptions {
isOpen: boolean;
isEditing: boolean;
selectedCell: { rowIndex: number; visibleColIndex: number } | null;
actualColumnIndex: (visibleColIndex: number) => number;
}
export interface CellDetailTarget {
rowIndex: number;
col: number;
}
export function defaultCellDetailTab(): CellDetailTab {
return "details";
}
@@ -35,6 +47,14 @@ export function valueEditorActions(options: { canSetNull: boolean; canFormatJson
return actions;
}
export function linkedCellDetailTarget(options: LinkedCellDetailOptions): CellDetailTarget | null {
if (!options.isOpen || options.isEditing || !options.selectedCell) return null;
return {
rowIndex: options.selectedCell.rowIndex,
col: options.actualColumnIndex(options.selectedCell.visibleColIndex),
};
}
export function isJsonColumnType(columnType: string | undefined): boolean {
const base = (columnType ?? "")
.trim()