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 }} + +