Files
dbgate/packages/datalib/src/CustomGridDisplay.ts
2024-07-10 15:53:26 +02:00

92 lines
2.5 KiB
TypeScript

import _ from 'lodash';
import { filterName, isTableColumnUnique } from 'dbgate-tools';
import { GridDisplay, ChangeCacheFunc, DisplayColumn, DisplayedColumnInfo, ChangeConfigFunc } from './GridDisplay';
import type {
TableInfo,
EngineDriver,
ViewInfo,
ColumnInfo,
NamedObjectInfo,
DatabaseInfo,
ForeignKeyInfo,
} from 'dbgate-types';
import { GridConfig, GridCache, createGridCache } from './GridConfig';
import { Expression, Select, treeToSql, dumpSqlSelect, ColumnRefExpression, Condition } from 'dbgate-sqltree';
export interface CustomGridColumn {
columnName: string;
columnLabel: string;
isPrimaryKey?: boolean;
}
export class CustomGridDisplay extends GridDisplay {
customColumns: CustomGridColumn[];
constructor(
public tableName: NamedObjectInfo,
columns: CustomGridColumn[],
driver: EngineDriver,
config: GridConfig,
setConfig: ChangeConfigFunc,
cache: GridCache,
setCache: ChangeCacheFunc,
dbinfo: DatabaseInfo,
serverVersion,
isReadOnly = false,
public additionalcondition: Condition = null
) {
super(config, setConfig, cache, setCache, driver, dbinfo, serverVersion);
this.customColumns = columns;
this.columns = columns.map(col => ({
columnName: col.columnName,
headerText: col.columnLabel,
uniqueName: col.columnName,
uniquePath: [col.columnName],
isPrimaryKey: col.isPrimaryKey,
isForeignKeyUnique: false,
schemaName: tableName.schemaName,
pureName: tableName.pureName,
}));
this.changeSetKeyFields = columns.filter(x => x.isPrimaryKey).map(x => x.columnName);
this.baseTable = {
...tableName,
columns: this.columns.map(x => ({ ...tableName, columnName: x.columnName, dataType: 'string' })),
foreignKeys: [],
};
this.filterable = true;
this.sortable = true;
this.groupable = false;
this.editable = !isReadOnly;
this.supportsReload = true;
}
createSelect(options = {}) {
const select = this.createSelectBase(
this.tableName,
[],
// @ts-ignore
// this.columns.map(col => ({
// columnName: col.columnName,
// })),
options,
this.customColumns.find(x => x.isPrimaryKey)?.columnName
);
select.selectAll = true;
if (this.additionalcondition) {
if (select.where) {
select.where = {
conditionType: 'and',
conditions: [select.where, this.additionalcondition],
};
} else {
select.where = this.additionalcondition;
}
}
return select;
}
}