From 6b5b33540fe80c6ea2842d0d5f969973ee1e8ceb Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Mon, 24 Aug 2026 18:22:10 +0000 Subject: [PATCH] feat(grid): show column defaults in new row placeholders Closes #3096 --- apps/desktop/src/components/grid/DataGrid.vue | 26 +++++--- .../lib/dataGrid/canvasDataGridRenderer.ts | 6 +- .../lib/dataGrid/dataGridColumnMetadata.ts | 2 +- .../dataGrid/dataGridDefaultPlaceholder.ts | 21 ++++++ .../app-tests/dataGridBooleanColumn.test.ts | 15 +++-- .../dataGridDefaultPlaceholder.test.ts | 64 +++++++++++++++++++ 6 files changed, 117 insertions(+), 17 deletions(-) create mode 100644 apps/desktop/src/lib/dataGrid/dataGridDefaultPlaceholder.ts create mode 100644 packages/app-tests/dataGridDefaultPlaceholder.test.ts diff --git a/apps/desktop/src/components/grid/DataGrid.vue b/apps/desktop/src/components/grid/DataGrid.vue index e0408d99e2..4662a75b1c 100644 --- a/apps/desktop/src/components/grid/DataGrid.vue +++ b/apps/desktop/src/components/grid/DataGrid.vue @@ -181,6 +181,7 @@ import { import { temporalCellEditorConfig, type TemporalCellEditorConfig } from "@/lib/dataGrid/dataGridTemporalEditor"; import { BOOLEAN_CELL_EDITOR_VALUES, booleanCellEditorValue, isBooleanCellValue, isBooleanColumnType, isPointInBooleanCheckbox, nextBooleanCellValue, normalizeBooleanCellValue, parseBooleanCellEditorValue } from "@/lib/dataGrid/dataGridBooleanColumn"; import { resolveDataGridColumnNullability, resolveDataGridColumnsByResultIndex } from "@/lib/dataGrid/dataGridColumnMetadata"; +import { resolveDataGridNewRowCellPlaceholder } from "@/lib/dataGrid/dataGridDefaultPlaceholder"; import { isCancelSearchShortcut, isCopyCurrentRowShortcut, isDeleteCurrentRowShortcut, isFocusSearchShortcut, isModRShortcut, isSaveShortcut, isToggleTransposeShortcut } from "@/lib/editor/keyboardShortcuts"; import { dataGridHeaderContentWidth, scrollbarGutterWidth } from "@/lib/dataGrid/dataGridScrollGutter"; import { canFetchNextDataGridSegment, canGoNextDataGridPage, dataGridTotalRowCountLabelKey, dataGridTruncationHintKey, hasCompleteLocalDataGridResult, resolveDataGridPaginationTotal, type DataGridInexactTotalRowCountMode } from "@/lib/dataGrid/dataGridPagination"; @@ -6580,8 +6581,15 @@ function rowNumberText(item: RowItem | undefined): string { return String(item.displayIndex + 1 + rowNumberPageOffset()); } -function draftCellPlaceholder(item: RowItem | undefined, columnIndex: number): string | null { - return item?.isDraft && item.data[columnIndex] === null ? t("grid.quickEntryDraftPlaceholder") : null; +const quickEntryDraftPlaceholder = computed(() => t("grid.quickEntryDraftPlaceholder")); + +function newRowCellPlaceholder(item: RowItem | undefined, columnIndex: number): string | null { + return resolveDataGridNewRowCellPlaceholder({ + row: item, + columnIndex, + column: tableColumnsByResultIndex.value[columnIndex], + draftFallback: quickEntryDraftPlaceholder.value, + }); } function columnTypeCacheSignature(): string { @@ -7349,7 +7357,7 @@ function drawCanvasGrid() { searchMatchKeys: searchMatchSet.value, currentSearchMatch: currentSearchMatch.value, formatCell: (value, columnIndex, row) => formatCellCached(visibleLargeValuePreviewValue(row, columnIndex, value), columnIndex, largeValueOriginalBytes(row, columnIndex)), - draftCellPlaceholder: t("grid.quickEntryDraftPlaceholder"), + newRowCellPlaceholder, isRowActive, rowCellsUseSelectionVisual, cellIsSelected, @@ -12036,8 +12044,8 @@ function currentGridContextMenuItems(): ContextMenuItem[] { />