diff --git a/packages/datalib/src/GridDisplay.ts b/packages/datalib/src/GridDisplay.ts
index 2fa082791..c5c48544c 100644
--- a/packages/datalib/src/GridDisplay.ts
+++ b/packages/datalib/src/GridDisplay.ts
@@ -9,6 +9,7 @@ import {
DatabaseInfo,
CollectionInfo,
SqlDialect,
+ ViewInfo,
} from 'dbgate-types';
import { parseFilter, getFilterType } from 'dbgate-filterparser';
import { filterName } from 'dbgate-tools';
@@ -69,10 +70,17 @@ export abstract class GridDisplay {
dialect: SqlDialect;
columns: DisplayColumn[];
baseTable?: TableInfo;
+ baseView?: ViewInfo;
baseCollection?: CollectionInfo;
+ get baseTableOrSimilar(): NamedObjectInfo {
+ return this.baseTable || this.baseCollection || this.baseView;
+ }
get baseTableOrCollection(): NamedObjectInfo {
return this.baseTable || this.baseCollection;
}
+ get baseTableOrView(): TableInfo | ViewInfo {
+ return this.baseTable || this.baseView;
+ }
changeSetKeyFields: string[] = null;
sortable = false;
groupable = false;
@@ -373,7 +381,7 @@ export abstract class GridDisplay {
getGrouping(uniqueName): GroupFunc {
if (this.isGrouped) {
if (this.config.grouping[uniqueName]) return this.config.grouping[uniqueName];
- const column = this.baseTable.columns.find(x => x.columnName == uniqueName);
+ const column = (this.baseTable || this.baseView)?.columns?.find(x => x.columnName == uniqueName);
if (isTypeLogical(column?.dataType)) return 'COUNT DISTINCT';
if (column?.autoIncrement) return 'COUNT';
return 'MAX';
@@ -413,9 +421,9 @@ export abstract class GridDisplay {
getChangeSetField(row, uniqueName, insertedRowIndex): ChangeSetFieldDefinition {
const col = this.columns.find(x => x.uniqueName == uniqueName);
if (!col) return null;
- const baseTableOrCollection = this.baseTableOrCollection;
- if (!baseTableOrCollection) return null;
- if (baseTableOrCollection.pureName != col.pureName || baseTableOrCollection.schemaName != col.schemaName) {
+ const baseObj = this.baseTableOrSimilar;
+ if (!baseObj) return null;
+ if (baseObj.pureName != col.pureName || baseObj.schemaName != col.schemaName) {
return null;
}
@@ -427,11 +435,11 @@ export abstract class GridDisplay {
}
getChangeSetRow(row, insertedRowIndex): ChangeSetRowDefinition {
- const baseTableOrCollection = this.baseTableOrCollection;
- if (!baseTableOrCollection) return null;
+ const baseObj = this.baseTableOrSimilar;
+ if (!baseObj) return null;
return {
- pureName: baseTableOrCollection.pureName,
- schemaName: baseTableOrCollection.schemaName,
+ pureName: baseObj.pureName,
+ schemaName: baseObj.schemaName,
insertedRowIndex,
condition: insertedRowIndex == null ? this.getChangeSetCondition(row) : null,
};
diff --git a/packages/datalib/src/ViewGridDisplay.ts b/packages/datalib/src/ViewGridDisplay.ts
index f8d24e756..2528cdbfe 100644
--- a/packages/datalib/src/ViewGridDisplay.ts
+++ b/packages/datalib/src/ViewGridDisplay.ts
@@ -20,6 +20,7 @@ export class ViewGridDisplay extends GridDisplay {
this.groupable = true;
this.editable = false;
this.supportsReload = true;
+ this.baseView = view;
}
getDisplayColumns(view: ViewInfo) {
diff --git a/packages/web/src/datagrid/ChangeSetGrider.ts b/packages/web/src/datagrid/ChangeSetGrider.ts
index b74b8d3f0..fc4002168 100644
--- a/packages/web/src/datagrid/ChangeSetGrider.ts
+++ b/packages/web/src/datagrid/ChangeSetGrider.ts
@@ -52,7 +52,7 @@ export default class ChangeSetGrider extends Grider {
) {
super();
this.changeSet = changeSetState && changeSetState.value;
- this.insertedRows = getChangeSetInsertedRows(this.changeSet, display?.baseTableOrCollection);
+ this.insertedRows = getChangeSetInsertedRows(this.changeSet, display?.baseTableOrSimilar);
this.setChangeSet = value => dispatchChangeSet({ type: 'set', value });
this.rowCacheIndexes = new Set();
this.rowDataCache = {};
@@ -169,7 +169,7 @@ export default class ChangeSetGrider extends Grider {
get rowCountInUpdate() {
if (this.batchChangeSet) {
- const newRows = getChangeSetInsertedRows(this.batchChangeSet, this.display.baseTable);
+ const newRows = getChangeSetInsertedRows(this.batchChangeSet, this.display.baseTableOrSimilar);
return this.sourceRows.length + newRows.length;
} else {
return this.rowCount;
@@ -178,13 +178,13 @@ export default class ChangeSetGrider extends Grider {
insertRow(): number {
const res = this.rowCountInUpdate;
- this.applyModification(chs => changeSetInsertNewRow(chs, this.display.baseTableOrCollection));
+ this.applyModification(chs => changeSetInsertNewRow(chs, this.display.baseTableOrSimilar));
return res;
}
insertDocuments(documents: any[]): number {
const res = this.rowCountInUpdate;
- this.applyModification(chs => changeSetInsertDocuments(chs, documents, this.display.baseTableOrCollection));
+ this.applyModification(chs => changeSetInsertDocuments(chs, documents, this.display.baseTableOrSimilar));
return res;
}
diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte
index 3cdafac91..28d6fae4e 100644
--- a/packages/web/src/datagrid/DataGridCore.svelte
+++ b/packages/web/src/datagrid/DataGridCore.svelte
@@ -758,15 +758,18 @@
// $: console.log('DISPLAY.config', display.config);
$: {
- if (display?.groupColumns && display?.baseTable) {
+ if (display?.groupColumns && display?.baseTableOrSimilar && onReferenceClick) {
onReferenceClick({
referenceId: stableStringify(display && display.groupColumns),
- schemaName: display.baseTable.schemaName,
- pureName: display.baseTable.pureName,
+ schemaName: display.baseTableOrSimilar?.schemaName,
+ pureName: display.baseTableOrSimilar?.pureName,
columns: display.groupColumns.map(col => ({
baseName: col,
refName: col,
- dataType: _.get(display.baseTable && display.baseTable.columns.find(x => x.columnName == col), 'dataType'),
+ dataType: _.get(
+ display.baseTableOrView?.columns?.find(x => x.columnName == col),
+ 'dataType'
+ ),
})),
});
}
diff --git a/packages/web/src/datagrid/SqlDataGridCore.svelte b/packages/web/src/datagrid/SqlDataGridCore.svelte
index e285898f8..623bd6f84 100644
--- a/packages/web/src/datagrid/SqlDataGridCore.svelte
+++ b/packages/web/src/datagrid/SqlDataGridCore.svelte
@@ -68,7 +68,6 @@
return parseInt(response.data.rows[0].count);
}
-