diff --git a/eda/eda_api/lib/module/datasource/datasource.controller.ts b/eda/eda_api/lib/module/datasource/datasource.controller.ts index 90c7ca1f..b1367324 100644 --- a/eda/eda_api/lib/module/datasource/datasource.controller.ts +++ b/eda/eda_api/lib/module/datasource/datasource.controller.ts @@ -7,9 +7,10 @@ import ConnectionModel from './model/connection.model'; import { EnCrypterService } from '../../services/encrypter/encrypter.service'; import BigQueryConfig from './model/BigQueryConfig.model'; import CachedQuery, { ICachedQuery } from '../../services/cache-service/cached-query.model'; -import { QueryOptions } from 'mongoose'; +import { Mongoose, QueryOptions } from 'mongoose'; import { upperCase } from 'lodash'; import Group from '../../module/admin/groups/model/group.model'; +import { json } from 'body-parser'; const cache_config = require('../../../config/cache.config'); export class DataSourceController { @@ -41,7 +42,6 @@ export class DataSourceController { if (err) { return next(new HttpException(404, 'Datasouce not found')); } - // ocultem el password dataSource.ds.connection.password = EnCrypterService.decode(dataSource.ds.connection.password); dataSource.ds.connection.password = '__-(··)-__'; @@ -54,7 +54,7 @@ export class DataSourceController { } } -/** AQUSTA FUNCIÓ RETORNA TOTS ELS DATASOURCES */ +/** aQUSTA FUNCIÓ RETORNA TOTS ELS DATASOURCES */ static async GetDataSourcesNames(req: Request, res: Response, next: NextFunction) { let options:QueryOptions = {}; DataSource.find({}, '_id ds.metadata.model_name ds.security', options, (err, ds) => { @@ -169,7 +169,7 @@ export class DataSourceController { return next(new HttpException(500, 'Error loading DataSources')); } const names = JSON.parse(JSON.stringify(ds)); - + for (let i = 0, n = names.length; i < n; i += 1) { const e = names[i]; // Si tenim propietari.... @@ -319,10 +319,10 @@ export class DataSourceController { } else { try { - const cn = req.qs.type !== 'bigquery' ? - new ConnectionModel(req.qs.user, req.qs.host, req.qs.database, req.qs.password, req.qs.port, - req.qs.type, req.qs.schema, req.body.poolLimit, req.qs.sid, req.qs.warehouse - ) : new BigQueryConfig(req.qs.type, req.qs.database, req.qs.project_id); + const cn = req.qs.type !== 'bigquery' ? new ConnectionModel(req.qs.user, req.qs.host, req.qs.database, + req.qs.password, req.qs.port, req.qs.type, + req.body.poolLimit, req.qs.schema, req.qs.sid, req.qs.warehouse) + : new BigQueryConfig(req.qs.type, req.qs.database, req.qs.project_id); const manager = await ManagerConnectionService.testConnection(cn); await manager.tryConnection(); @@ -343,10 +343,8 @@ export class DataSourceController { const actualDS = await DataSourceController.getMongoDataSource(req.params.id); const passwd = req.qs.password === '__-(··)-__' ? EnCrypterService.decode(actualDS.ds.connection.password) : req.qs.password; - const cn = new ConnectionModel( - req.qs.user, req.qs.host, req.qs.database, passwd, req.qs.port, - req.qs.type, req.qs.schema, req.body.poolLimit, req.qs.sidm, req.qs.warehouse - ); + const cn = new ConnectionModel(req.qs.user, req.qs.host, req.qs.database, passwd, + req.qs.port, req.qs.type, req.qs.schema, req.body.poolLimit, req.qs.sidm, req.qs.warehouse); const manager = await ManagerConnectionService.testConnection(cn); await manager.tryConnection(); return res.status(200).json({ ok: true }); @@ -422,15 +420,13 @@ export class DataSourceController { static async GenerateDataModelSql(req: Request, res: Response, next: NextFunction) { try { - const cn = new ConnectionModel( - req.body.user, req.body.host, req.body.database, req.body.password, req.body.port, - req.body.type, req.body.schema, req.body.poolLimit, req.body.sid, req.qs.warehouse - ); + const cn = new ConnectionModel(req.body.user, req.body.host, req.body.database, + req.body.password, req.body.port, req.body.type, req.body.schema, req.body.poolLimit, req.body.sid, req.qs.warehouse); const manager = await ManagerConnectionService.testConnection(cn); const tables = await manager.generateDataModel(req.body.optimize, req.body.filter, req.body.name); const CC = req.body.allowCache === 1 ? cache_config.DEFAULT_CACHE_CONFIG : cache_config.DEFAULT_NO_CACHE_CONFIG; - + const datasource: IDataSource = new DataSource({ ds: { connection: { @@ -459,18 +455,23 @@ export class DataSourceController { tables: tables } } - }); + }); + datasource.save((err, data_source) => { + if (err) { + + console.log(err); return next(new HttpException(500, `Error saving the datasource`)); } return res.status(201).json({ ok: true, data_source_id: data_source._id }); - }); + }); } catch (err) { + next(err); } } @@ -495,10 +496,8 @@ export class DataSourceController { const actualDS = await DataSourceController.getMongoDataSource(req.params.id); const passwd = req.body.password === '__-(··)-__' ? EnCrypterService.decode(actualDS.ds.connection.password) : req.body.password - const cn = new ConnectionModel( - req.body.user, req.body.host, req.body.database, passwd, req.body.port, - req.body.type, req.body.schema, req.body.poolLimit, req.body.sid, req.qs.warehouse - ); + const cn = new ConnectionModel(req.body.user, req.body.host, req.body.database, passwd, + req.body.port, req.body.type, req.body.schema, req.body.poolLimit, req.body.sid, req.qs.warehouse); const manager = await ManagerConnectionService.testConnection(cn); const storedDataModel = JSON.parse(JSON.stringify(actualDS)); let tables = []; diff --git a/eda/eda_api/lib/server.ts b/eda/eda_api/lib/server.ts index fb65c3db..c144fccd 100644 --- a/eda/eda_api/lib/server.ts +++ b/eda/eda_api/lib/server.ts @@ -32,7 +32,7 @@ app.use(function(err: IError, req, res, next) { }); app.listen(PORT, () => { - console.log('\n\x1b[34m=====\x1b[0m Server start on port \x1b[32m[8666] \x1b[0m \x1b[34m=====\x1b[0m\n'); + console.log('\n\x1b[34m=====\x1b[0m Server start on port \x1b[32m['+PORT+'] \x1b[0m \x1b[34m=====\x1b[0m\n'); }); /** diff --git a/eda/eda_api/lib/services/query-builder/qb-systems/mySql-builder.service.ts b/eda/eda_api/lib/services/query-builder/qb-systems/mySql-builder.service.ts index f78f6a3f..5e6b5871 100644 --- a/eda/eda_api/lib/services/query-builder/qb-systems/mySql-builder.service.ts +++ b/eda/eda_api/lib/services/query-builder/qb-systems/mySql-builder.service.ts @@ -9,11 +9,15 @@ export class MySqlBuilderService extends QueryBuilderService { return tables; } - public normalQuery(columns: string[], origin: string, dest: any[], joinTree: any[], grouping: any[], tables: Array, limit: number, joinType: string, valueListJoins: Array): any { + public normalQuery(columns: string[], origin: string, dest: any[], joinTree: any[], grouping: any[], tables: Array, limit: number, joinType: string, valueListJoins: Array, schema:any, database:any, forSelector: any): any { let o = tables.filter(table => table.name === origin).map(table => { return table.query ? table.query : table.name })[0]; let myQuery = `SELECT ${columns.join(', ')} \nFROM ${o}`; + if (forSelector === true) { + myQuery = `SELECT DISTINCT ${columns.join(', ')} \nFROM ${o}`; + } + //to WHERE CLAUSE const filters = this.queryTODO.filters.filter(f => { const column = this.findColumn(f.filter_table, f.filter_column); @@ -72,6 +76,8 @@ export class MySqlBuilderService extends QueryBuilderService { const order_columns_string = orderColumns.join(','); if (order_columns_string.length > 0) { myQuery = `${myQuery}\norder by ${order_columns_string}`; + } else if (forSelector === true) { + myQuery = `${myQuery}\norder by 1`; } if (limit) myQuery += `\nlimit ${limit}`; diff --git a/eda/eda_api/lib/services/query-builder/query-builder.service.ts b/eda/eda_api/lib/services/query-builder/query-builder.service.ts index a8ccfc16..ed33fffb 100644 --- a/eda/eda_api/lib/services/query-builder/query-builder.service.ts +++ b/eda/eda_api/lib/services/query-builder/query-builder.service.ts @@ -30,7 +30,6 @@ export abstract class QueryBuilderService { this.usercode = user.email; this.groups = user.role; this.tables = dataModel.ds.model.tables; - } abstract getFilters(filters, type: string); @@ -41,7 +40,7 @@ export abstract class QueryBuilderService { abstract processFilter(filter: any, columnType: string); abstract normalQuery(columns: string[], origin: string, dest: any[], joinTree: any[], grouping: any[], tables: Array, limit: number, - joinType: string,valueListJoins:any[], Schema?: string, database?: string); + joinType: string,valueListJoins:any[], Schema?: string, database?: string, forSelector?: any ); abstract sqlQuery(query: string, filters: any[], filterMarks: string[]): string; abstract buildPermissionJoin(origin: string, join: string[], permissions: any[], schema?: string); abstract parseSchema(tables: string[], schema?: string, database?: string); @@ -185,7 +184,7 @@ export abstract class QueryBuilderService { let tables = this.dataModel.ds.model.tables .map(table => { return { name: table.table_name, query: table.query } }); this.query = this.normalQuery(columns, origin, dest, joinTree, grouping, tables, - this.queryTODO.queryLimit, this.queryTODO.joinType, valueListJoins, this.dataModel.ds.connection.schema, this.dataModel.ds.connection.database); + this.queryTODO.queryLimit, this.queryTODO.joinType, valueListJoins, this.dataModel.ds.connection.schema, this.dataModel.ds.connection.database, this.queryTODO.forSelector); return this.query; } } @@ -276,6 +275,7 @@ export abstract class QueryBuilderService { return `SELECT DISTINCT ${this.queryTODO.fields[0].valueListSource.target_description_column} \nFROM ${table}`; } + /** esto se usa para las consultas que hacemos a bbdd para generar el modelo */ public simpleQuery(columns: string[], origin: string) { @@ -300,8 +300,7 @@ export abstract class QueryBuilderService { return res; } public getPermissions(modelPermissions, modelTables, originTable) { - - + originTable = this.cleanOriginTable(originTable); let filters = []; const permissions = this.getUserPermissions(modelPermissions); diff --git a/eda/eda_api/package.json b/eda/eda_api/package.json index 26447712..4c2ab079 100644 --- a/eda/eda_api/package.json +++ b/eda/eda_api/package.json @@ -6,7 +6,7 @@ "scripts": { "start": "nodemon", "start:forever": "npm run build && forever start -c node ./dist/server.js", - "start:pm2": "npm run build && pm2 start ./dist/server.js", + "start:pm2": "npm run build && pm2 start ./dist/server.js ", "edapi": "forever start -c node ./dist/server.js", "build": "tsc && npm run movejpgs", "dev": "ts-node ./lib/server.ts", @@ -42,6 +42,7 @@ "node-schedule": "^2.0.0", "nodemailer": "^6.7.2", "nodemon": "^2.0.20", + "object-hash": "^3.0.0", "oracledb": "^5.0.0", "password_hash": "^1.1.0", "pg": "^8.2.1", diff --git a/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/eda-blank-panel.component.html b/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/eda-blank-panel.component.html index ae162152..adcaefb2 100644 --- a/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/eda-blank-panel.component.html +++ b/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/eda-blank-panel.component.html @@ -41,12 +41,13 @@
- -
-

+
+
+

Entidades

-
+
+
-
-

+
+

Atributos

+
+ Columnas de: {{getNiceTableName(userSelectedTable)}} +
-
+
- +
@@ -118,17 +122,18 @@

{{draggFields}}

-
+ - - + + {{item.display_name.default}} @@ -138,27 +143,28 @@

- Filtrar los resultados por: + Filtrar los resultados por:


+ [cdkDropListConnectedTo]="[columnsList, selectList]" (cdkDropListDropped)="drop($event)" + >

{{draggFilters}}

- - + + {{item.display_name.default}}
- +
@@ -180,7 +186,7 @@

- +

@@ -525,4 +531,4 @@
Indicaciones
- \ No newline at end of file + diff --git a/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/eda-blank-panel.component.ts b/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/eda-blank-panel.component.ts index e151406c..8dda37aa 100644 --- a/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/eda-blank-panel.component.ts +++ b/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/eda-blank-panel.component.ts @@ -9,7 +9,7 @@ import { Column, EdaPanel, InjectEdaPanel } from '@eda/models/model.index'; import { DashboardService, ChartUtilsService, AlertService, SpinnerService, FileUtiles, EdaChartType, - FilterType, QueryBuilderService, OrdenationType + FilterType, QueryBuilderService, OrdenationType, UserService } from '@eda/services/service.index'; import { EdaPageDialogComponent, EdaDialogController, EdaContextMenu, EdaDialogCloseEvent @@ -153,6 +153,7 @@ export class EdaBlankPanelComponent implements OnInit { public colorsDeepCopy: any = {}; public queryFromServer: string = ''; + public showHiddId: boolean; // join types joinTypeOptions: any[] = [ @@ -174,7 +175,8 @@ export class EdaBlankPanelComponent implements OnInit { public chartUtils: ChartUtilsService, public alertService: AlertService, public spinnerService: SpinnerService, - public groupService: GroupService + public groupService: GroupService, + public userService: UserService ) { this.initializeBlankPanelUtils(); this.initializeInputs(); @@ -192,7 +194,7 @@ export class EdaBlankPanelComponent implements OnInit { if (this.panel.content) { try{ const query = this.panel.content.query; - + if (query.query.modeSQL) { this.modeSQL = true; this.currentSQLQuery = query.query.SQLexpression; @@ -272,6 +274,7 @@ export class EdaBlankPanelComponent implements OnInit { this.tables = _.cloneDeep(tables.allTables); this.tablesToShow = _.cloneDeep(tables.tablesToShow); this.sqlOriginTables = _.cloneDeep(tables.sqlOriginTables); + } /** @@ -305,6 +308,7 @@ export class EdaBlankPanelComponent implements OnInit { * Sets configuration dialog and chart * @param panelContent panel content to build configuration . */ + buildGlobalconfiguration(panelContent: any) { if (!panelContent.query.query.modeSQL) { try{ @@ -323,6 +327,7 @@ export class EdaBlankPanelComponent implements OnInit { } if(duplicatedColumn){ duplicatedColumn.display_name.default = el.display_name; + PanelInteractionUtils.handleAggregationType4DuplicatedColumns( this, duplicatedColumn); this.currentQuery.push(duplicatedColumn); // Moc la columna directament perque es una duplicada.... o no.... } @@ -527,6 +532,13 @@ export class EdaBlankPanelComponent implements OnInit { event.container.data, event.previousIndex, event.currentIndex); + + //apertura del diálogo de atributos o filtros + if(event.container.id == 'cdk-drop-list-1'){ + this.openColumnDialog( event.container.data[event.currentIndex] ); + }else{ + this.openColumnDialog( event.container.data[event.currentIndex] , true); + } } @@ -590,6 +602,7 @@ export class EdaBlankPanelComponent implements OnInit { if (event === EdaDialogCloseEvent.NONE) { this.configController = undefined; } + this.configController = undefined; } }); diff --git a/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/filter-dialog/filter-dialog.component.ts b/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/filter-dialog/filter-dialog.component.ts index 5ba1c608..0259f309 100644 --- a/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/filter-dialog/filter-dialog.component.ts +++ b/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/filter-dialog/filter-dialog.component.ts @@ -180,7 +180,8 @@ export class FilterDialogComponent extends EdaDialogAbstract { dataSource: this.controller.params.inject.dataSource._id, dashboard: this.controller.params.inject.dashboard_id, panel: this.controller.params.panel._id, - filters: [] + filters: [], + forSelector: true }; this.selectedColumn.ordenation_type= 'ASC' ; this.dashboardService.executeQuery(this.queryBuilder.normalQuery([this.selectedColumn], params)).subscribe( diff --git a/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/panel-charts/panel-chart.component.ts b/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/panel-charts/panel-chart.component.ts index dec311c8..5fe42243 100644 --- a/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/panel-charts/panel-chart.component.ts +++ b/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/panel-charts/panel-chart.component.ts @@ -102,10 +102,13 @@ export class PanelChartComponent implements OnInit, OnChanges, OnDestroy { */ if (this.props.data && this.props.data.values.length !== 0 && !this.props.data.values.reduce((a, b) => a && b.every(element => element === null), true)) { + setTimeout(_ => { this.NO_DATA = false; }); + this.changeChartType(); + } /** * If no data diff --git a/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/panel-utils/panel-interaction-utils.ts b/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/panel-utils/panel-interaction-utils.ts index 3c655ae0..d98464b2 100644 --- a/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/panel-utils/panel-interaction-utils.ts +++ b/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/panel-utils/panel-interaction-utils.ts @@ -189,7 +189,14 @@ export const PanelInteractionUtils = { const queryFromServer = ebp.panel.content.query.query.fields; if (!column.ordenation_type) { - column.ordenation_type = 'No'; + if( column.column_type === 'numeric'){ + column.ordenation_type = 'Desc'; + }else if( column.column_type === 'date'){ + column.ordenation_type = 'Asc'; + }else{ + column.ordenation_type = 'No'; + } + } const colInServer = queryFromServer.filter(c => c.column_name === column.column_name && c.table_id === column.table_id)[0]; @@ -205,12 +212,26 @@ export const PanelInteractionUtils = { } } else if (!column.ordenation_type) { + if( column.column_type === 'numeric'){ + ebp.ordenationTypes = [ + { display_name: 'ASC', value: 'Asc', selected: false }, + { display_name: 'DESC', value: 'Desc', selected: true }, + { display_name: 'NO', value: 'No', selected:false } + ]; + }else if( column.column_type === 'date'){ + ebp.ordenationTypes = [ + { display_name: 'ASC', value: 'Asc', selected: true }, + { display_name: 'DESC', value: 'Desc', selected: false }, + { display_name: 'NO', value: 'No', selected:false } + ]; + } else{ + ebp.ordenationTypes = [ + { display_name: 'ASC', value: 'Asc', selected: false }, + { display_name: 'DESC', value: 'Desc', selected: false }, + { display_name: 'NO', value: 'No', selected:true } + ]; + } - ebp.ordenationTypes = [ - { display_name: 'ASC', value: 'Asc', selected: false }, - { display_name: 'DESC', value: 'Desc', selected: true }, - { display_name: 'NO', value: 'No', selected:false } - ]; } else { ebp.ordenationTypes.forEach(ord => { diff --git a/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/panel-utils/tables-utils.ts b/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/panel-utils/tables-utils.ts index 9310b3c1..3279082c 100644 --- a/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/panel-utils/tables-utils.ts +++ b/eda/eda_app/src/app/module/components/eda-panels/eda-blank-panel/panel-utils/tables-utils.ts @@ -55,7 +55,7 @@ export const TableUtils = { let allTables = tables.filter(table => table.visible === true) .sort(TableUtils.sortTables); - + if (applyToAllfilter.present) { const originTable = allTables.filter(t => t.table_name === applyToAllfilter.refferenceTable)[0]; @@ -69,7 +69,6 @@ export const TableUtils = { let tablesToShow = _.cloneDeep(allTables); - return { allTables : allTables, sqlOriginTables : sqlOriginTables, tablesToShow : tablesToShow } } diff --git a/eda/eda_app/src/app/module/components/eda-table/eda-table.component.html b/eda/eda_app/src/app/module/components/eda-table/eda-table.component.html index b61e691c..6f83e5aa 100644 --- a/eda/eda_app/src/app/module/components/eda-table/eda-table.component.html +++ b/eda/eda_app/src/app/module/components/eda-table/eda-table.component.html @@ -6,7 +6,7 @@
- +
@@ -19,7 +19,7 @@ - {{label.title}} @@ -29,7 +29,7 @@ - {{col.header}} @@ -127,4 +127,4 @@
- \ No newline at end of file + diff --git a/eda/eda_app/src/app/module/pages/dashboard/dashboard.component.html b/eda/eda_app/src/app/module/pages/dashboard/dashboard.component.html index a9da2643..470be933 100644 --- a/eda/eda_app/src/app/module/pages/dashboard/dashboard.component.html +++ b/eda/eda_app/src/app/module/pages/dashboard/dashboard.component.html @@ -17,7 +17,7 @@

{{title}}

- +

class="p-button-raised p-button-outlined filters-size"> - +
{{filter.column.label}}: - @@ -77,7 +77,7 @@

{{title}}

-
+

@@ -142,11 +142,11 @@

{{title}}

-
@@ -226,12 +226,12 @@

{{title}}

- +
@@ -244,16 +244,16 @@

{{title}}

-
+
- Edición privada: + Edición privada:
-
+

diff --git a/eda/eda_app/src/app/module/pages/dashboard/dashboard.component.ts b/eda/eda_app/src/app/module/pages/dashboard/dashboard.component.ts index e55983b3..4d3d6d63 100644 --- a/eda/eda_app/src/app/module/pages/dashboard/dashboard.component.ts +++ b/eda/eda_app/src/app/module/pages/dashboard/dashboard.component.ts @@ -517,6 +517,8 @@ export class DashboardComponent implements OnInit, AfterViewInit, OnDestroy { } }catch(e){ } + + }); } @@ -948,6 +950,7 @@ export class DashboardComponent implements OnInit, AfterViewInit, OnDestroy { private async loadGlobalFiltersData(filterList: any, targetTable: string): Promise { const filter = filterList; + const queryParams = { table: targetTable, dataSource: this.dataSource._id, @@ -959,6 +962,7 @@ export class DashboardComponent implements OnInit, AfterViewInit, OnDestroy { filter.column.value.ordenation_type = 'ASC'; try { let query = this.queryBuilderService.normalQuery([filter.column.value], queryParams); + query.query.forSelector = true; const res = await this.dashboardService.executeQuery(query).toPromise(); filter.data = res[1].filter(item => !!item[0]).map(item => ({ label: item[0], value: item[0] })); } catch (err) { diff --git a/eda/eda_app/src/app/services/utils/query-builder.service.ts b/eda/eda_app/src/app/services/utils/query-builder.service.ts index f3c0dc92..8eec7c85 100644 --- a/eda/eda_app/src/app/services/utils/query-builder.service.ts +++ b/eda/eda_app/src/app/services/utils/query-builder.service.ts @@ -12,6 +12,7 @@ export interface QueryParams { config?: any; queryLimit? : number; joinType?:string; + forSelector?: boolean } @Injectable() @@ -117,7 +118,8 @@ export class QueryBuilderService extends ApiService { modeSQL : modeSQL, SQLexpression : SQLexpression, queryLimit : params.queryLimit, - joinType: params.joinType + joinType: params.joinType, + forSelector: params.forSelector }, output: { labels, diff --git a/eda/eda_app/src/app/shared/models/dashboard-models/query.model.ts b/eda/eda_app/src/app/shared/models/dashboard-models/query.model.ts index 64b743cf..528ec685 100644 --- a/eda/eda_app/src/app/shared/models/dashboard-models/query.model.ts +++ b/eda/eda_app/src/app/shared/models/dashboard-models/query.model.ts @@ -18,7 +18,8 @@ export interface Query { modeSQL: boolean, SQLexpression : string, queryLimit : number, - joinType: string + joinType: string, + forSelector?: boolean ; }; output: {