mirror of
https://github.com/dbeaver/cloudbeaver.git
synced 2026-10-24 11:35:54 +08:00
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:
@@ -19,4 +19,5 @@ export enum EObjectFeature {
|
||||
'dataSourceTemporary' = 'dataSourceTemporary',
|
||||
'dataSourceConnected' = 'dataSourceConnected',
|
||||
'entityContainer' = 'entityContainer',
|
||||
'supportsDataFilter' = 'supportsDataFilter'
|
||||
}
|
||||
|
||||
+5
-2
@@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
+1
-1
@@ -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))
|
||||
|
||||
+1
-1
@@ -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', '应用'],
|
||||
|
||||
Reference in New Issue
Block a user