From 2024171c8d5f07213ad30baef2a5348bcf80349c Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Sat, 16 May 2026 10:25:05 +0800 Subject: [PATCH] feat(grid): edit simple query results --- src/components/grid/DataGrid.vue | 50 +++- src/components/layout/ContentArea.vue | 2 + src/composables/useDataGridEditor.ts | 12 + src/i18n/locales/en.ts | 19 ++ src/i18n/locales/zh-CN.ts | 16 ++ src/lib/dataGridSql.ts | 77 ++++-- src/lib/sqlAnalysis.ts | 360 ++++++++++++++++++++------ src/stores/queryStore.ts | 58 ++++- src/types/database.ts | 20 +- tests/dataGridSql.test.ts | 53 ++++ tests/sqlAnalysis.test.ts | 101 ++++++++ 11 files changed, 656 insertions(+), 112 deletions(-) create mode 100644 tests/sqlAnalysis.test.ts diff --git a/src/components/grid/DataGrid.vue b/src/components/grid/DataGrid.vue index da9aebf00c..f27da448a4 100644 --- a/src/components/grid/DataGrid.vue +++ b/src/components/grid/DataGrid.vue @@ -42,6 +42,7 @@ import { Link2, ListTree, TableProperties, + LockKeyhole, } from "lucide-vue-next"; import { Button } from "@/components/ui/button"; import { @@ -110,6 +111,8 @@ const props = defineProps<{ connectionId?: string; database?: string; context?: "results" | "table-data"; + sourceColumns?: Array; + queryEditabilityReason?: string; initialWhereInput?: string; tableMeta?: { schema?: string; @@ -949,6 +952,16 @@ const pageSize = ref(settingsStore.editorSettings.pageSize); const currentPage = ref(1); const isFullPage = computed(() => props.result.rows.length >= pageSize.value); const isResultsContext = computed(() => props.context === "results"); +const resultEditStatus = computed(() => { + if (!isResultsContext.value || !hasData.value) return null; + if (props.editable && props.tableMeta) return "editable"; + if (props.queryEditabilityReason) return "readonly"; + return null; +}); +const queryEditabilityHint = computed(() => { + const reason = props.queryEditabilityReason; + return reason ? t(`grid.queryEditUnsupported.${reason}`) : ""; +}); const canUseWhereSearch = computed(() => !!props.tableMeta && !!props.onExecuteSql && !isResultsContext.value); const tableUsesSyntheticRowId = computed(() => usesSyntheticRowIdKey(props.databaseType, props.tableMeta?.primaryKeys ?? []), @@ -1079,6 +1092,7 @@ const editor = useDataGridEditor({ connectionId: computed(() => props.connectionId), database: computed(() => props.database), tableMeta: computed(() => props.tableMeta), + sourceColumns: computed(() => props.sourceColumns), canEditExistingRows, onExecuteSql: computed(() => props.onExecuteSql), customSave: computed(() => props.customSave), @@ -1127,6 +1141,7 @@ const { discardChanges, rowDataWithChanges, coerceCellValue, + canEditColumn, resetGridVerticalScroll, getResetScrollAfterResult, clearResetScrollAfterResult, @@ -1137,6 +1152,10 @@ function canEditRowItem(item: RowItem | undefined): boolean { return !!props.editable && !!item && !item.isDeleted && (item.isNew || canEditExistingRows.value); } +function canEditCellItem(item: RowItem | undefined, columnIndex: number): boolean { + return canEditRowItem(item) && canEditColumn(columnIndex); +} + function canDeleteRowItem(item: RowItem | undefined): boolean { return !!props.editable && !!item && !item.isDeleted && (item.isNew || canEditExistingRows.value); } @@ -1447,7 +1466,7 @@ const activeCellDetail = computed(() => { displayValue, length: value === null ? 0 : String(value).length, formattedJson, - isEditable: canEditRowItem(item), + isEditable: canEditCellItem(item, cell.col), }; }); @@ -2344,6 +2363,31 @@ defineExpose({
+ + +
+ {{ t("grid.queryEditReady") }} +
+
+ + {{ t("grid.queryEditReadyHint", { table: tableMeta?.tableName }) }} + +
+ + +
+ + {{ t("grid.queryEditReadOnly") }} +
+
+ + {{ queryEditabilityHint }} + +