form view infrastructure, loading row from DB

This commit is contained in:
Jan Prochazka
2021-01-09 20:37:49 +01:00
parent bb35a496f8
commit b71b58c93f
10 changed files with 250 additions and 36 deletions

View File

@@ -0,0 +1,23 @@
import _ from 'lodash';
import { GridConfig, GridCache, GridConfigColumns, createGridCache, GroupFunc } from './GridConfig';
import { ForeignKeyInfo, TableInfo, ColumnInfo, EngineDriver, NamedObjectInfo, DatabaseInfo } from 'dbgate-types';
import { parseFilter, getFilterType } from 'dbgate-filterparser';
import { filterName } from './filterName';
import { ChangeSetFieldDefinition, ChangeSetRowDefinition } from './ChangeSet';
import { Expression, Select, treeToSql, dumpSqlSelect, Condition } from 'dbgate-sqltree';
import { isTypeLogical } from 'dbgate-tools';
import { ChangeCacheFunc, ChangeConfigFunc, DisplayColumn } from './GridDisplay';
export class FormViewDisplay {
isLoadedCorrectly = true;
columns: DisplayColumn[];
constructor(
public config: GridConfig,
protected setConfig: ChangeConfigFunc,
public cache: GridCache,
protected setCache: ChangeCacheFunc,
public driver?: EngineDriver,
public dbinfo: DatabaseInfo = null
) {}
}

View File

@@ -29,6 +29,8 @@ export interface GridConfig extends GridConfigColumns {
grouping: { [uniqueName: string]: GroupFunc };
childConfig?: GridConfig;
reference?: GridReferenceDefinition;
isFormView?: boolean;
formViewKey?: { [uniqueName: string]: string };
}
export interface GridCache {

View File

@@ -518,4 +518,20 @@ export abstract class GridDisplay {
conditions,
};
}
switchToFormView(rowData) {
if (!this.baseTable) return;
const { primaryKey } = this.baseTable;
if (!primaryKey) return;
const { columns } = primaryKey;
this.setConfig((cfg) => ({
...cfg,
isFormView: true,
formViewKey: _.pick(
rowData,
columns.map((x) => x.columnName)
),
}));
}
}

View File

@@ -0,0 +1,62 @@
import { FormViewDisplay } from './FormViewDisplay';
import _ from 'lodash';
import { GridDisplay, ChangeCacheFunc, DisplayColumn, DisplayedColumnInfo, ChangeConfigFunc } from './GridDisplay';
import { TableInfo, EngineDriver, ViewInfo, ColumnInfo, NamedObjectInfo, DatabaseInfo } from 'dbgate-types';
import { GridConfig, GridCache, createGridCache } from './GridConfig';
import { Expression, Select, treeToSql, dumpSqlSelect, mergeConditions, Condition } from 'dbgate-sqltree';
import { filterName } from './filterName';
import { TableGridDisplay } from './TableGridDisplay';
export class TableFormViewDisplay extends FormViewDisplay {
public table: TableInfo;
// use utility functions from GridDisplay and publish result in FromViewDisplat interface
private gridDisplay: TableGridDisplay;
constructor(
public tableName: NamedObjectInfo,
driver: EngineDriver,
config: GridConfig,
setConfig: ChangeConfigFunc,
cache: GridCache,
setCache: ChangeCacheFunc,
dbinfo: DatabaseInfo
) {
super(config, setConfig, cache, setCache, driver, dbinfo);
this.gridDisplay = new TableGridDisplay(tableName, driver, config, setConfig, cache, setCache, dbinfo);
this.isLoadedCorrectly = this.gridDisplay.isLoadedCorrectly;
this.columns = this.gridDisplay.columns;
}
getPrimaryKeyCondition(): Condition {
if (!this.config.formViewKey) return null;
return {
conditionType: 'and',
conditions: _.keys(this.config.formViewKey).map((columnName) => ({
conditionType: 'binary',
operator: '=',
left: {
exprType: 'column',
columnName,
source: {
alias: 'basetbl',
},
},
right: {
exprType: 'value',
value: this.config.formViewKey[columnName],
},
})),
};
}
getCurrentRowQuery() {
if (!this.driver) return null;
const select = this.gridDisplay.createSelect();
if (!select) return null;
select.topRecords = 1;
select.where = mergeConditions(select.where, this.getPrimaryKeyCondition());
const sql = treeToSql(this.driver, select, dumpSqlSelect);
return sql;
}
}

View File

@@ -1,11 +1,13 @@
export * from "./GridDisplay";
export * from "./GridConfig";
export * from "./TableGridDisplay";
export * from "./ViewGridDisplay";
export * from "./JslGridDisplay";
export * from "./ChangeSet";
export * from "./filterName";
export * from "./FreeTableGridDisplay";
export * from "./FreeTableModel";
export * from "./MacroDefinition";
export * from "./runMacro";
export * from './GridDisplay';
export * from './GridConfig';
export * from './TableGridDisplay';
export * from './ViewGridDisplay';
export * from './JslGridDisplay';
export * from './ChangeSet';
export * from './filterName';
export * from './FreeTableGridDisplay';
export * from './FreeTableModel';
export * from './MacroDefinition';
export * from './runMacro';
export * from './FormViewDisplay';
export * from './TableFormViewDisplay';