From 69d4345931542cc6d64d15c6d06f1d1b385a9202 Mon Sep 17 00:00:00 2001 From: Wroud Date: Mon, 3 Aug 2020 14:42:35 +0300 Subject: [PATCH] feat(plugin-data-viewer): read-only mode CB-186 --- .../src/AgGridTable/AgGridContext.ts | 1 + .../src/AgGridTable/AgGridTableController.ts | 7 +++++- .../src/TableViewer/TableViewerModel.ts | 22 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/webapp/packages/plugin-data-spreadsheet/src/AgGridTable/AgGridContext.ts b/webapp/packages/plugin-data-spreadsheet/src/AgGridTable/AgGridContext.ts index 633ff177f8..9b040f4a74 100644 --- a/webapp/packages/plugin-data-spreadsheet/src/AgGridTable/AgGridContext.ts +++ b/webapp/packages/plugin-data-spreadsheet/src/AgGridTable/AgGridContext.ts @@ -10,6 +10,7 @@ import { TableSelection } from './TableSelection/TableSelection'; export type AgGridContext = { selection: TableSelection; + isReadonly(): boolean; isCellEdited(rowId: number, column: string): boolean; revertCellValue(rowNumber: number, column: string): void; onEditSave(): void; diff --git a/webapp/packages/plugin-data-spreadsheet/src/AgGridTable/AgGridTableController.ts b/webapp/packages/plugin-data-spreadsheet/src/AgGridTable/AgGridTableController.ts index cc4a05c5ca..0eea56d6ce 100644 --- a/webapp/packages/plugin-data-spreadsheet/src/AgGridTable/AgGridTableController.ts +++ b/webapp/packages/plugin-data-spreadsheet/src/AgGridTable/AgGridTableController.ts @@ -25,7 +25,7 @@ import { } from '@ag-grid-community/core'; import { injectable, IInitializableController, IDestructibleController } from '@cloudbeaver/core-di'; import { - TableViewerModel, SortModel, AgGridRow, IAgGridCol + TableViewerModel, SortModel, AgGridRow, IAgGridCol, AccessMode } from '@cloudbeaver/plugin-data-viewer'; import { AgGridContext } from './AgGridContext'; @@ -46,6 +46,7 @@ export class AgGridTableController implements IInitializableController, IDestruc */ private readonly context: AgGridContext = { selection: this.selection, + isReadonly: () => this.gridModel.access === AccessMode.Readonly, isCellEdited: this.isCellEdited.bind(this), revertCellValue: this.revertCellValue.bind(this), onEditSave: this.onEditSave.bind(this), @@ -265,6 +266,10 @@ function mapDataToColumns(columns?: IAgGridCol[]): ColDef[] { headerName: v.label, field: `${v.position}`, type: v.dataKind, + editable: (params: any) => { + const context: AgGridContext = params.context; + return !context.isReadonly(); + }, valueGetter: (params: ValueGetterParams) => { if (!params.data) { return ''; diff --git a/webapp/packages/plugin-data-viewer/src/TableViewer/TableViewerModel.ts b/webapp/packages/plugin-data-viewer/src/TableViewer/TableViewerModel.ts index 2827244c48..605ed38c02 100644 --- a/webapp/packages/plugin-data-viewer/src/TableViewer/TableViewerModel.ts +++ b/webapp/packages/plugin-data-viewer/src/TableViewer/TableViewerModel.ts @@ -28,6 +28,11 @@ export const fetchingSettings = { fetchDefault: 200, }; +export enum AccessMode { + Default, + Readonly +} + export type AgGridRow = any[]; export type SortMode = 'asc' | 'desc' | null; @@ -68,6 +73,7 @@ export interface ITableViewerModelOptions { executionContext?: IExecutionContext | null; // will be filled before fist data fetch sourceName?: string; // TODO: refactor it, used for showing sql query for export noLoaderWhileRequestingDataAsync?: boolean; + access?: AccessMode; requestDataAsync( model: TableViewerModel, rowOffset: number, @@ -92,6 +98,9 @@ export class TableViewerModel { executionContext: IExecutionContext | null; sourceName?: string; noLoaderWhileRequestingDataAsync?: boolean; + + @observable access: AccessMode; + requestDataAsync: ( model: TableViewerModel, rowOffset: number, @@ -147,6 +156,7 @@ export class TableViewerModel { this.executionContext = options.executionContext || null; this.sourceName = options.sourceName; this.noLoaderWhileRequestingDataAsync = options.noLoaderWhileRequestingDataAsync; + this.access = options.access || AccessMode.Default; this.requestDataAsync = options.requestDataAsync; this._saveChanges = options.saveChanges; this.resetSubject = new Subject(); @@ -214,6 +224,10 @@ export class TableViewerModel { } isEdited(): boolean { + if (this.access === AccessMode.Readonly) { + return false; + } + return this.tableEditor.isEdited(); } @@ -230,6 +244,10 @@ export class TableViewerModel { } async saveChanges(): Promise { + if (this.access === AccessMode.Readonly) { + return; + } + const diffs = this.tableEditor.getChanges(); if (!diffs.length) { @@ -304,6 +322,10 @@ export class TableViewerModel { } onCellEditingStopped(rowNumber: number, column: string, value: any) { + if (this.access === AccessMode.Readonly) { + return; + } + this.tableEditor.editCellValue(rowNumber, column, value); }