feat(grid): show column comments in condition suggestions

This commit is contained in:
zipg authored and GitHub committed 2026-07-17 00:05:50 +08:00
1 parent ecec25f0f4
commit dfd47bc54c
7 files changed
+174 -21

No files matched your search

@@ -7404,6 +7404,7 @@ const gridContextMenuItems = computed<ContextMenuItem[]>(() => {
v-model:order-by-input="orderByInput"
v-model:filter-builder-open="filterBuilderOpen"
:columns="props.tableMeta?.columns.map((column) => column.name) ?? props.result.columns"
:condition-columns="props.tableMeta?.columns ?? props.result.columns"
:history-scope="conditionHistoryScope"
:can-use-where-search="canUseWhereSearch"
:compact="compactDataGridToolbar"
@@ -1,14 +1,14 @@
<script setup lang="ts">
import { computed, nextTick, onMounted, onUnmounted, ref, useId, watch, type CSSProperties } from "vue";
import { ChevronDown, X } from "@lucide/vue";
import { useDataGridConditionEditor, type DataGridConditionSuggestionProvider } from "@/composables/useDataGridConditionEditor";
import { getDataGridConditionSuggestionPosition } from "@/lib/dataGrid/dataGridConditionSuggestionPosition";
import { useDataGridConditionEditor, type DataGridConditionColumnOption, type DataGridConditionSuggestionProvider } from "@/composables/useDataGridConditionEditor";
import { getDataGridConditionSuggestionPosition, getDataGridConditionSuggestionPreferredWidth } from "@/lib/dataGrid/dataGridConditionSuggestionPosition";
import type { DataGridConditionHistoryKind, DataGridConditionHistoryScope } from "@/lib/dataGrid/dataGridConditionHistory";
const props = withDefaults(
defineProps<{
kind: DataGridConditionHistoryKind;
columns?: readonly string[];
columns?: readonly DataGridConditionColumnOption[];
historyScope: DataGridConditionHistoryScope;
placeholder?: string;
ariaLabel?: string;
@@ -64,6 +64,7 @@ const activeEditor = computed(() => overlayRef.value ?? inputRef.value);
const hasValue = computed(() => modelValue.value.trim().length > 0);
const emptyHistoryText = computed(() => (modelValue.value.trim() ? props.historyNoMatchesText : props.historyEmptyText));
const activeSuggestionId = computed(() => (editor.highlightedIndex.value >= 0 ? `${suggestionListId}-${editor.highlightedIndex.value}` : undefined));
const suggestionPreferredWidth = computed(() => getDataGridConditionSuggestionPreferredWidth(editor.suggestions.value));
const suggestionStyle = computed<CSSProperties>(() => ({
left: `${suggestionPosition.value.left}px`,
top: `${suggestionPosition.value.top}px`,
@@ -112,7 +113,11 @@ function updateSuggestionPosition() {
void nextTick(() => {
const target = activeEditor.value;
if (!target) return;
suggestionPosition.value = getDataGridConditionSuggestionPosition(target.getBoundingClientRect(), { viewportWidth: window.innerWidth });
suggestionPosition.value = getDataGridConditionSuggestionPosition(target.getBoundingClientRect(), {
viewportWidth: window.innerWidth,
preferredWidth: suggestionPreferredWidth.value,
maxWidth: suggestionPreferredWidth.value === undefined ? undefined : 520,
});
});
}
@@ -234,6 +239,9 @@ function hideHistoryPreview() {
}
watch(modelValue, () => resizeEditor());
watch(suggestionPreferredWidth, () => {
if (editor.dropdownOpen.value) updateSuggestionPosition();
});
watch(
() => editor.dropdownOpen.value,
(open) => {
@@ -357,7 +365,10 @@ defineExpose({ focus, dismiss: editor.dismiss, rememberHistory: editor.rememberH
"
@mouseleave="hideHistoryPreview"
>
<span data-condition-history-text class="min-w-0 flex-1 truncate font-mono">{{ suggestion.value }}</span>
<span data-condition-history-text class="data-grid-condition-suggestion-field min-w-0 truncate" :class="suggestion.comment ? 'max-w-[75%] shrink-0' : 'flex-1'" :title="suggestion.value">
{{ suggestion.value }}
</span>
<span v-if="suggestion.comment" class="ml-3 min-w-0 flex-1 truncate text-right text-muted-foreground" :title="suggestion.comment">{{ suggestion.comment }}</span>
<button v-if="suggestion.kind === 'history'" type="button" class="ml-2 shrink-0 text-muted-foreground hover:text-foreground" @mousedown.stop.prevent="editor.deleteHistory(suggestion.value)">
<X class="h-3 w-3" />
</button>
@@ -418,6 +429,16 @@ defineExpose({ focus, dismiss: editor.dismiss, rememberHistory: editor.rememberH
transform: translateX(-4px);
}
.data-grid-topbar-condition-input,
.data-grid-condition-suggestion-field {
font-family: var(--data-grid-condition-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
font-size: 0.875rem;
font-variant-ligatures: none;
font-feature-settings:
"liga" 0,
"calt" 0;
}
.data-grid-topbar-condition-input {
width: 100%;
max-width: 100%;
@@ -430,13 +451,7 @@ defineExpose({ focus, dismiss: editor.dismiss, rememberHistory: editor.rememberH
border-radius: 0;
appearance: none;
scrollbar-width: none;
font-family: var(--data-grid-condition-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
font-size: 0.875rem;
line-height: 1.5rem;
font-variant-ligatures: none;
font-feature-settings:
"liga" 0,
"calt" 0;
}
:global(.dark) .data-grid-topbar-condition-input {
@@ -6,6 +6,7 @@ import { Button } from "@/components/ui/button";
import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";
import DataGridConditionEditor from "@/components/grid/DataGridConditionEditor.vue";
import DataGridFilterBuilder from "@/components/grid/DataGridFilterBuilder.vue";
import type { DataGridConditionColumnOption } from "@/composables/useDataGridConditionEditor";
import type { DataGridStructuredFilterRule } from "@/composables/useDataGridFilterBuilder";
import type { DataGridConditionHistoryScope } from "@/lib/dataGrid/dataGridConditionHistory";
import type { DataGridContextFilterMode } from "@/lib/dataGrid/dataGridSql";
@@ -22,6 +23,7 @@ const props = defineProps<{
whereInput: string;
orderByInput: string;
columns: readonly string[];
conditionColumns: readonly DataGridConditionColumnOption[];
historyScope: DataGridConditionHistoryScope;
canUseWhereSearch: boolean;
compact: boolean;
@@ -174,7 +176,7 @@ onUnmounted(onResizeEnd);
<DataGridConditionEditor
:model-value="whereInput"
kind="where"
:columns="columns"
:columns="conditionColumns"
:history-scope="historyScope"
placeholder="WHERE"
:history-empty-text="t('grid.conditionHistoryEmpty')"
@@ -199,7 +201,7 @@ onUnmounted(onResizeEnd);
<DataGridConditionEditor
:model-value="orderByInput"
kind="orderBy"
:columns="columns"
:columns="conditionColumns"
:history-scope="historyScope"
placeholder="ORDER BY"
:history-empty-text="t('grid.conditionHistoryEmpty')"