Merge pull request #708 from dbeaver/fix/data-filter-feature

fix(plugin-data-viewer): CB-1332 CB-1333 support dataFilter object fe…
This commit is contained in:
Alexey
2022-03-14 19:50:33 +03:00
committed by GitHub
14 changed files with 40 additions and 10 deletions
@@ -19,4 +19,5 @@ export enum EObjectFeature {
'dataSourceTemporary' = 'dataSourceTemporary',
'dataSourceConnected' = 'dataSourceConnected',
'entityContainer' = 'entityContainer',
'supportsDataFilter' = 'supportsDataFilter'
}
@@ -69,8 +69,11 @@ export const TableColumnHeader = observer<HeaderRendererProps<any>>(function Tab
const resultIndex = dataGridContext.resultIndex;
const model = dataGridContext.model;
const dataReadonly = getComputed(() => tableDataContext.isReadOnly() || model.isReadonly());
const sortingDisabled = getComputed(() => model.source.results.length > 1 || !model.source.executionContext?.context);
const sortingDisabled = getComputed(
() => !tableDataContext.constraints.supported || !model.source.executionContext?.context
);
let resultColumn: SqlResultColumn | undefined;
let icon = calculatedColumn.icon;
@@ -99,7 +102,7 @@ export const TableColumnHeader = observer<HeaderRendererProps<any>>(function Tab
}
}
function handleClick(event: React.MouseEvent<HTMLDivElement, MouseEvent>) {
function handleClick(event: React.MouseEvent<HTMLDivElement>) {
gridSelectionContext.selectColumn(calculatedColumn.idx, event.ctrlKey || event.metaKey);
dataGridContext.focus();
}
@@ -10,7 +10,10 @@ import { createContext } from 'react';
import type { Column } from 'react-data-grid';
import type { SqlResultColumn } from '@cloudbeaver/core-sdk';
import type { IResultSetColumnKey, IResultSetElementKey, IResultSetRowKey, IResultSetValue, DatabaseEditChangeType, ResultSetDataAction, ResultSetEditAction, ResultSetFormatAction, ResultSetViewAction } from '@cloudbeaver/plugin-data-viewer';
import type {
IResultSetColumnKey, IResultSetElementKey, IResultSetRowKey, IResultSetValue, DatabaseEditChangeType,
ResultSetDataAction, ResultSetEditAction, ResultSetFormatAction, ResultSetViewAction, ResultSetConstraintAction
} from '@cloudbeaver/plugin-data-viewer';
declare module 'react-data-grid' {
interface Column<TRow, TSummaryRow = unknown> {
@@ -30,6 +33,7 @@ export interface ITableData {
data: ResultSetDataAction;
editor: ResultSetEditAction;
view: ResultSetViewAction;
constraints: ResultSetConstraintAction;
columns: Array<Column<IResultSetRowKey, any>>;
columnKeys: IResultSetColumnKey[];
rows: IResultSetRowKey[];
@@ -11,7 +11,11 @@ import type { Column } from 'react-data-grid';
import { useObservableRef } from '@cloudbeaver/core-blocks';
import { TextTools, uuid } from '@cloudbeaver/core-utils';
import { IDatabaseDataModel, IDatabaseResultSet, IResultSetColumnKey, IResultSetElementKey, IResultSetRowKey, ResultSetDataAction, ResultSetDataKeysUtils, ResultSetEditAction, ResultSetFormatAction, ResultSetViewAction } from '@cloudbeaver/plugin-data-viewer';
import {
IDatabaseDataModel, IDatabaseResultSet, IResultSetColumnKey, IResultSetElementKey, IResultSetRowKey,
ResultSetConstraintAction, ResultSetDataAction, ResultSetDataKeysUtils,
ResultSetEditAction, ResultSetFormatAction, ResultSetViewAction
} from '@cloudbeaver/plugin-data-viewer';
import { IndexFormatter } from './Formatters/IndexFormatter';
import { TableColumnHeader } from './TableColumnHeader/TableColumnHeader';
@@ -40,6 +44,7 @@ export function useTableData(
const data = model.source.getAction(resultIndex, ResultSetDataAction);
const editor = model.source.getAction(resultIndex, ResultSetEditAction);
const view = model.source.getAction(resultIndex, ResultSetViewAction);
const constraints = model.source.getAction(resultIndex, ResultSetConstraintAction);
return useObservableRef<ITableData & { gridDIVElement: React.RefObject<HTMLDivElement | null> }>(() => ({
get gridDiv(): HTMLDivElement | null {
@@ -176,12 +181,14 @@ export function useTableData(
data: observable.ref,
editor: observable.ref,
view: observable.ref,
constraints: observable.ref,
gridDIVElement: observable.ref,
}, {
format,
data,
editor,
view,
constraints,
gridDIVElement,
});
}
@@ -108,7 +108,7 @@ export function useDataViewerDatabaseDataModel(tab: ITab<IObjectViewerTabState>)
model = dataViewerTableService.create(
connectionInfo,
this.tab.handlerState.objectId
node
);
this.tab.handlerState.tableId = model.id;
dataViewerDataChangeConfirmationService.trackTableDataUpdate(model.id);
@@ -6,6 +6,7 @@
* you may not use this file except in compliance with the License.
*/
import { EObjectFeature, NavNode } from '@cloudbeaver/core-app';
import { ConnectionExecutionContextService, Connection } from '@cloudbeaver/core-connections';
import { injectable } from '@cloudbeaver/core-di';
import { AsyncTaskInfoService, GraphQLService } from '@cloudbeaver/core-sdk';
@@ -48,7 +49,7 @@ export class DataViewerTableService {
create(
connection: Connection,
containerNodePath = ''
node: NavNode | undefined
): IDatabaseDataModel<IDataContainerOptions, IDatabaseResultSet> {
const source = new ContainerDataSource(
this.graphQLService,
@@ -59,11 +60,12 @@ export class DataViewerTableService {
source
.setOptions({
connectionId: connection.id,
containerNodePath,
containerNodePath: node?.id ?? '',
constraints: [],
whereFilter: '',
})
.setSupportedDataFormats(connection.supportedDataFormats);
.setSupportedDataFormats(connection.supportedDataFormats)
.setConstraintsAvailable(node?.objectFeatures.includes(EObjectFeature.supportsDataFilter) ?? true);
const editable = this.dataViewerService.isDataEditable(connection);
const dataModel = this.tableViewerStorageService.add(new DatabaseDataModel(source))
@@ -27,7 +27,7 @@ export class ResultSetConstraintAction extends DatabaseDataAction<IDatabaseDataO
static dataFormat = [ResultDataFormat.Resultset, ResultDataFormat.Document];
get supported(): boolean {
return this.source.results.length < 2;
return this.source.constraintsAvailable && this.source.results.length < 2;
}
get orderConstraints(): SqlDataFilterConstraint[] {
@@ -22,6 +22,7 @@ export abstract class DatabaseDataSource<TOptions, TResult extends IDatabaseData
access: DatabaseDataAccessMode;
dataFormat: ResultDataFormat;
supportedDataFormats: ResultDataFormat[];
constraintsAvailable: boolean;
actions: IDatabaseDataActions<TOptions, TResult>;
results: TResult[];
offset: number;
@@ -49,6 +50,7 @@ export abstract class DatabaseDataSource<TOptions, TResult extends IDatabaseData
this.prevOptions = null;
this.options = null;
this.disabled = false;
this.constraintsAvailable = true;
this.activeRequest = null;
this.activeSave = null;
this.activeTask = null;
@@ -77,6 +79,7 @@ export abstract class DatabaseDataSource<TOptions, TResult extends IDatabaseData
error: observable.ref,
executionContext: observable,
disabled: observable,
constraintsAvailable: observable.ref,
activeRequest: observable.ref,
activeSave: observable.ref,
activeTask: observable.ref,
@@ -216,6 +219,11 @@ export abstract class DatabaseDataSource<TOptions, TResult extends IDatabaseData
return this;
}
setConstraintsAvailable(value: boolean) {
this.constraintsAvailable = value;
return this;
}
setExecutionContext(context: IConnectionExecutionContext | null): this {
this.executionContext = context;
return this;
@@ -29,6 +29,7 @@ export interface IDatabaseDataSource<TOptions, TResult extends IDatabaseDataResu
readonly access: DatabaseDataAccessMode;
readonly dataFormat: ResultDataFormat;
readonly supportedDataFormats: ResultDataFormat[];
readonly constraintsAvailable: boolean;
readonly actions: IDatabaseDataActions<TOptions, TResult>;
readonly results: TResult[];
readonly offset: number;
@@ -36,7 +36,7 @@ export const TableWhereFilter: PlaceholderComponent<ITableHeaderPlaceholderProps
<InlineEditor
name="data_where"
value={state.filter}
placeholder={translate('table_header_sql_expression')}
placeholder={translate(state.constraints?.supported ? 'table_header_sql_expression' : 'table_header_sql_expression_not_supported')}
controlsPosition='inside'
edited={!!state.filter}
disableSave={!state.applicableFilter}
@@ -1,5 +1,6 @@
export default [
['table_header_sql_expression', 'Enter a SQL expression to filter results'],
['table_header_sql_expression_not_supported', 'Data filter is not supported'],
['data_viewer_tab_title', 'Data'],
['data_viewer_value_edit', 'Edit'],
['data_viewer_value_apply', 'Apply'],
@@ -1,5 +1,6 @@
export default [
['table_header_sql_expression', 'Digita una espresione SQL per filtrare i risultati'],
['table_header_sql_expression_not_supported', 'Data filter is not supported'],
['data_viewer_tab_title', 'Dati'],
['data_viewer_value_edit', 'Modifica'],
['data_viewer_value_apply', 'Applica'],
@@ -1,5 +1,6 @@
export default [
['table_header_sql_expression', 'Введите SQL выражение чтобы отфильтровать результаты'],
['table_header_sql_expression_not_supported', 'Фильтрация данных недоступна'],
['data_viewer_tab_title', 'Данные'],
['data_viewer_value_edit', 'Изменить'],
['data_viewer_value_apply', 'Применить'],
@@ -1,5 +1,6 @@
export default [
['table_header_sql_expression', '输入SQL表达式以过滤结果'],
['table_header_sql_expression_not_supported', 'Data filter is not supported'],
['data_viewer_tab_title', '数据'],
['data_viewer_value_edit', '编辑'],
['data_viewer_value_apply', '应用'],