From 691c88b38c633cfaec67119a70159cd35c1312ba Mon Sep 17 00:00:00 2001 From: Naumov Alexey Date: Fri, 26 Nov 2021 00:08:00 +0300 Subject: [PATCH 1/3] feat(core-sdk): CB-1403 add quota error --- .../core-localization/src/locales/en.ts | 1 + .../core-localization/src/locales/ru.ts | 1 + .../core-sdk/src/ServerInternalError.ts | 6 +++ .../packages/core-sdk/src/getErrorDetails.ts | 11 +++- .../core-sdk/src/queries/getAsyncTaskInfo.gql | 1 + webapp/packages/core-sdk/src/sdk.ts | 4 +- .../ExportNotification/ExportNotification.tsx | 15 ++++-- .../ExportNotificationController.ts | 23 ++++++-- .../plugin-data-export/src/locales/en.ts | 3 +- .../plugin-data-export/src/locales/ru.ts | 3 +- .../src/TableViewer/TableError.tsx | 52 +++++++++++++------ 11 files changed, 95 insertions(+), 25 deletions(-) diff --git a/webapp/packages/core-localization/src/locales/en.ts b/webapp/packages/core-localization/src/locales/en.ts index 1e2213fc48..4e7ee22d01 100644 --- a/webapp/packages/core-localization/src/locales/en.ts +++ b/webapp/packages/core-localization/src/locales/en.ts @@ -67,5 +67,6 @@ export const defaultENLocale = [ ['app_root_session_expired_title', 'Session expired'], ['app_root_session_expired_message', 'Session has been expired. Do you want to reload?'], ['app_root_session_expired_reload', 'Reload'], + ['app_root_quota_exceeded', 'Quota exceeded'], ['core_eventsLog_dbeaverErrorDetails', 'Error details'], ]; diff --git a/webapp/packages/core-localization/src/locales/ru.ts b/webapp/packages/core-localization/src/locales/ru.ts index 1eb6400d52..f4c2c88c9a 100644 --- a/webapp/packages/core-localization/src/locales/ru.ts +++ b/webapp/packages/core-localization/src/locales/ru.ts @@ -65,5 +65,6 @@ export const defaultRULocale = [ ['app_root_session_expired_title', 'Сессия истекла'], ['app_root_session_expired_message', 'Сессия истекла. Хотите перезагрузить страницу?'], ['app_root_session_expired_reload', 'Перезагрузить'], + ['app_root_quota_exceeded', 'Квота превышена'], ['core_eventsLog_dbeaverErrorDetails', 'Детали ошибки'], ]; diff --git a/webapp/packages/core-sdk/src/ServerInternalError.ts b/webapp/packages/core-sdk/src/ServerInternalError.ts index 78b85d4c73..ff8ab6f952 100644 --- a/webapp/packages/core-sdk/src/ServerInternalError.ts +++ b/webapp/packages/core-sdk/src/ServerInternalError.ts @@ -9,8 +9,13 @@ import { DetailsError } from './DetailsError'; import type { ServerError } from './sdk'; +export enum ServerErrorType { + 'QUOTE_EXCEEDED' = 'quotaExceeded' +} + export class ServerInternalError extends DetailsError implements ServerError { readonly errorCode?: string; + readonly errorType?: string; readonly stackTrace?: string; readonly causedBy?: ServerError; @@ -18,6 +23,7 @@ export class ServerInternalError extends DetailsError implements ServerError { super(error.message); this.name = 'Server Internal Error'; this.errorCode = error.errorCode; + this.errorType = error.errorType; this.stackTrace = error.stackTrace; this.causedBy = error.causedBy; } diff --git a/webapp/packages/core-sdk/src/getErrorDetails.ts b/webapp/packages/core-sdk/src/getErrorDetails.ts index 73446e102d..343d0188c0 100644 --- a/webapp/packages/core-sdk/src/getErrorDetails.ts +++ b/webapp/packages/core-sdk/src/getErrorDetails.ts @@ -7,11 +7,13 @@ */ import { DetailsError } from './DetailsError'; +import { ServerInternalError } from './ServerInternalError'; export interface IErrorDetails { name: string; message: string; hasDetails: boolean; + errorType?: string; } export function hasDetails(error: Error): error is DetailsError { @@ -20,9 +22,16 @@ export function hasDetails(error: Error): error is DetailsError { export function getErrorDetails(error: Error | DetailsError): IErrorDetails { const exceptionMessage = hasDetails(error) ? error.errorMessage : error.message || error.name; - return { + + const details: IErrorDetails = { name: error.name, message: exceptionMessage, hasDetails: hasDetails(error), }; + + if (error instanceof ServerInternalError && error.errorType) { + details.errorType = error.errorType; + } + + return details; } diff --git a/webapp/packages/core-sdk/src/queries/getAsyncTaskInfo.gql b/webapp/packages/core-sdk/src/queries/getAsyncTaskInfo.gql index d7cd7064d4..6114d06b2d 100644 --- a/webapp/packages/core-sdk/src/queries/getAsyncTaskInfo.gql +++ b/webapp/packages/core-sdk/src/queries/getAsyncTaskInfo.gql @@ -13,6 +13,7 @@ mutation getAsyncTaskInfo( error { message errorCode + errorType stackTrace } taskResult diff --git a/webapp/packages/core-sdk/src/sdk.ts b/webapp/packages/core-sdk/src/sdk.ts index e1cad510d5..fefbdcf2c9 100644 --- a/webapp/packages/core-sdk/src/sdk.ts +++ b/webapp/packages/core-sdk/src/sdk.ts @@ -1133,6 +1133,7 @@ export interface ServerConfigInput { export interface ServerError { causedBy?: Maybe; errorCode?: Maybe; + errorType?: Maybe; message?: Maybe; stackTrace?: Maybe; } @@ -1695,7 +1696,7 @@ export type GetAsyncTaskInfoMutationVariables = Exact<{ removeOnFinish: Scalars['Boolean']; }>; -export interface GetAsyncTaskInfoMutation { taskInfo: { id: string; name?: Maybe; running: boolean; status?: Maybe; taskResult?: Maybe; error?: Maybe<{ message?: Maybe; errorCode?: Maybe; stackTrace?: Maybe }> } } +export interface GetAsyncTaskInfoMutation { taskInfo: { id: string; name?: Maybe; running: boolean; status?: Maybe; taskResult?: Maybe; error?: Maybe<{ message?: Maybe; errorCode?: Maybe; errorType?: Maybe; stackTrace?: Maybe }> } } export type GetNetworkHandlersQueryVariables = Exact<{ [key: string]: never }>; @@ -2763,6 +2764,7 @@ export const GetAsyncTaskInfoDocument = ` error { message errorCode + errorType stackTrace } taskResult diff --git a/webapp/packages/plugin-data-export/src/ExportNotification/ExportNotification.tsx b/webapp/packages/plugin-data-export/src/ExportNotification/ExportNotification.tsx index 4be2685ac2..8cc48e859a 100644 --- a/webapp/packages/plugin-data-export/src/ExportNotification/ExportNotification.tsx +++ b/webapp/packages/plugin-data-export/src/ExportNotification/ExportNotification.tsx @@ -21,6 +21,14 @@ import { EDeferredState } from '@cloudbeaver/core-utils'; import { ExportNotificationController } from './ExportNotificationController'; const styles = css` + message { + font-size: 16px; + opacity: 0.8; + overflow: auto; + max-height: 100px; + word-break: break-word; + white-space: pre-line; + } source-name { composes: theme-typography--body2 from global; padding-top: 16px; @@ -44,14 +52,15 @@ export const ExportNotification = observer(function ExportNotification({ }) { const controller = useController(ExportNotificationController, notification); const translate = useTranslate(); - const { title, status } = controller.status; + const { title, status, message } = controller.status; return styled(useStyles(styles))( - + {message && {message}} + {controller.sourceName} {controller.task?.context.sourceName && (
@@ -61,7 +70,7 @@ export const ExportNotification = observer(function ExportNotification({
           
         
         
-          {status === ENotificationType.Info && (
+          {status === ENotificationType.Info && controller.downloadUrl && (
             <>
               
-      {error.details?.hasDetails && (
-        
-      )}
-      
+        {!quote && error.details?.hasDetails && (
+          
+        )}
+        
+      
     
   );
 });

From 1020dbfee42b0c1510461848b1822928b2037e4f Mon Sep 17 00:00:00 2001
From: Naumov Alexey 
Date: Fri, 26 Nov 2021 13:35:34 +0300
Subject: [PATCH 2/3] feat(core-sdk): CB-1403 add AsyncTaskInfo fragment

---
 .../core-sdk/src/ServerInternalError.ts       |  4 +-
 .../packages/core-sdk/src/getErrorDetails.ts  |  6 +-
 .../data-transfer/exportDataFromContainer.gql |  9 +-
 .../data-transfer/exportDataFromResults.gql   |  9 +-
 .../src/queries/fragments/AsyncTaskInfo.gql   | 13 +++
 .../core-sdk/src/queries/getAsyncTaskInfo.gql | 12 +--
 .../grid/asyncReadDataFromContainer.gql       | 11 +--
 .../src/queries/grid/asyncSqlExecuteQuery.gql | 11 +--
 webapp/packages/core-sdk/src/sdk.ts           | 87 +++++++------------
 .../ExportNotification/ExportNotification.tsx |  2 +-
 .../src/TableViewer/TableError.tsx            |  2 +-
 11 files changed, 58 insertions(+), 108 deletions(-)
 create mode 100644 webapp/packages/core-sdk/src/queries/fragments/AsyncTaskInfo.gql

diff --git a/webapp/packages/core-sdk/src/ServerInternalError.ts b/webapp/packages/core-sdk/src/ServerInternalError.ts
index ff8ab6f952..b67ceca9c5 100644
--- a/webapp/packages/core-sdk/src/ServerInternalError.ts
+++ b/webapp/packages/core-sdk/src/ServerInternalError.ts
@@ -15,7 +15,7 @@ export enum ServerErrorType {
 
 export class ServerInternalError extends DetailsError implements ServerError {
   readonly errorCode?: string;
-  readonly errorType?: string;
+  readonly errorType?: ServerErrorType;
   readonly stackTrace?: string;
   readonly causedBy?: ServerError;
 
@@ -23,7 +23,7 @@ export class ServerInternalError extends DetailsError implements ServerError {
     super(error.message);
     this.name = 'Server Internal Error';
     this.errorCode = error.errorCode;
-    this.errorType = error.errorType;
+    this.errorType = error.errorType as ServerErrorType;
     this.stackTrace = error.stackTrace;
     this.causedBy = error.causedBy;
   }
diff --git a/webapp/packages/core-sdk/src/getErrorDetails.ts b/webapp/packages/core-sdk/src/getErrorDetails.ts
index 343d0188c0..8f61a471a8 100644
--- a/webapp/packages/core-sdk/src/getErrorDetails.ts
+++ b/webapp/packages/core-sdk/src/getErrorDetails.ts
@@ -7,13 +7,14 @@
  */
 
 import { DetailsError } from './DetailsError';
+import { ServerErrorType } from './ServerInternalError';
 import { ServerInternalError } from './ServerInternalError';
 
 export interface IErrorDetails {
   name: string;
   message: string;
   hasDetails: boolean;
-  errorType?: string;
+  errorType?: ServerErrorType;
 }
 
 export function hasDetails(error: Error): error is DetailsError {
@@ -31,6 +32,9 @@ export function getErrorDetails(error: Error | DetailsError): IErrorDetails {
 
   if (error instanceof ServerInternalError && error.errorType) {
     details.errorType = error.errorType;
+    if (error.errorType === ServerErrorType.QUOTE_EXCEEDED) {
+      details.hasDetails = false;
+    }
   }
 
   return details;
diff --git a/webapp/packages/core-sdk/src/queries/data-transfer/exportDataFromContainer.gql b/webapp/packages/core-sdk/src/queries/data-transfer/exportDataFromContainer.gql
index 2580359ca5..d41f8c3fdc 100644
--- a/webapp/packages/core-sdk/src/queries/data-transfer/exportDataFromContainer.gql
+++ b/webapp/packages/core-sdk/src/queries/data-transfer/exportDataFromContainer.gql
@@ -8,13 +8,6 @@ query exportDataFromContainer(
     containerNodePath: $containerNodePath
     parameters: $parameters
   ) {
-    id
-    running
-    taskResult
-    error {
-      message
-      errorCode
-      stackTrace
-    }
+    ...AsyncTaskInfo
   }
 }
diff --git a/webapp/packages/core-sdk/src/queries/data-transfer/exportDataFromResults.gql b/webapp/packages/core-sdk/src/queries/data-transfer/exportDataFromResults.gql
index a7940c734f..6a8f13452b 100644
--- a/webapp/packages/core-sdk/src/queries/data-transfer/exportDataFromResults.gql
+++ b/webapp/packages/core-sdk/src/queries/data-transfer/exportDataFromResults.gql
@@ -10,13 +10,6 @@ query exportDataFromResults(
     resultsId: $resultsId
     parameters: $parameters
   ) {
-    id
-    running
-    taskResult
-    error {
-      message
-      errorCode
-      stackTrace
-    }
+    ...AsyncTaskInfo
   }
 }
diff --git a/webapp/packages/core-sdk/src/queries/fragments/AsyncTaskInfo.gql b/webapp/packages/core-sdk/src/queries/fragments/AsyncTaskInfo.gql
new file mode 100644
index 0000000000..fa74f3832a
--- /dev/null
+++ b/webapp/packages/core-sdk/src/queries/fragments/AsyncTaskInfo.gql
@@ -0,0 +1,13 @@
+fragment AsyncTaskInfo on AsyncTaskInfo {
+  id
+  name
+  running
+  status
+  error {
+    message
+    errorCode
+    errorType
+    stackTrace
+  }
+  taskResult
+}
\ No newline at end of file
diff --git a/webapp/packages/core-sdk/src/queries/getAsyncTaskInfo.gql b/webapp/packages/core-sdk/src/queries/getAsyncTaskInfo.gql
index 6114d06b2d..f1aa48026e 100644
--- a/webapp/packages/core-sdk/src/queries/getAsyncTaskInfo.gql
+++ b/webapp/packages/core-sdk/src/queries/getAsyncTaskInfo.gql
@@ -6,16 +6,6 @@ mutation getAsyncTaskInfo(
         id: $taskId
         removeOnFinish: $removeOnFinish
     ) {
-        id
-        name
-        running
-        status
-        error {
-            message
-            errorCode
-            errorType
-            stackTrace
-        }
-        taskResult
+       ...AsyncTaskInfo
     }
 }
diff --git a/webapp/packages/core-sdk/src/queries/grid/asyncReadDataFromContainer.gql b/webapp/packages/core-sdk/src/queries/grid/asyncReadDataFromContainer.gql
index fae3572a18..d89081cecd 100644
--- a/webapp/packages/core-sdk/src/queries/grid/asyncReadDataFromContainer.gql
+++ b/webapp/packages/core-sdk/src/queries/grid/asyncReadDataFromContainer.gql
@@ -15,15 +15,6 @@ mutation asyncReadDataFromContainer(
         filter: $filter
         dataFormat: $dataFormat
     ) {
-       id
-        name
-        running
-        status
-        error {
-            message
-            errorCode
-            stackTrace
-        }
-        taskResult
+       ...AsyncTaskInfo
     }
 }
diff --git a/webapp/packages/core-sdk/src/queries/grid/asyncSqlExecuteQuery.gql b/webapp/packages/core-sdk/src/queries/grid/asyncSqlExecuteQuery.gql
index 183d1dfd15..b2e1d0ec18 100644
--- a/webapp/packages/core-sdk/src/queries/grid/asyncSqlExecuteQuery.gql
+++ b/webapp/packages/core-sdk/src/queries/grid/asyncSqlExecuteQuery.gql
@@ -14,15 +14,6 @@ mutation asyncSqlExecuteQuery(
         filter: $filter
         dataFormat: $dataFormat
     ) {
-        id
-        name
-        running
-        status
-        error {
-            message
-            errorCode
-            stackTrace
-        }
-        taskResult
+        ...AsyncTaskInfo
     }
 }
diff --git a/webapp/packages/core-sdk/src/sdk.ts b/webapp/packages/core-sdk/src/sdk.ts
index fefbdcf2c9..1dcb1f1dd4 100644
--- a/webapp/packages/core-sdk/src/sdk.ts
+++ b/webapp/packages/core-sdk/src/sdk.ts
@@ -1635,7 +1635,7 @@ export type ExportDataFromContainerQueryVariables = Exact<{
   parameters: DataTransferParameters;
 }>;
 
-export interface ExportDataFromContainerQuery { taskInfo: { id: string; running: boolean; taskResult?: Maybe; error?: Maybe<{ message?: Maybe; errorCode?: Maybe; stackTrace?: Maybe }> } }
+export interface ExportDataFromContainerQuery { taskInfo: { id: string; name?: Maybe; running: boolean; status?: Maybe; taskResult?: Maybe; error?: Maybe<{ message?: Maybe; errorCode?: Maybe; errorType?: Maybe; stackTrace?: Maybe }> } }
 
 export type ExportDataFromResultsQueryVariables = Exact<{
   connectionId: Scalars['ID'];
@@ -1644,7 +1644,7 @@ export type ExportDataFromResultsQueryVariables = Exact<{
   parameters: DataTransferParameters;
 }>;
 
-export interface ExportDataFromResultsQuery { taskInfo: { id: string; running: boolean; taskResult?: Maybe; error?: Maybe<{ message?: Maybe; errorCode?: Maybe; stackTrace?: Maybe }> } }
+export interface ExportDataFromResultsQuery { taskInfo: { id: string; name?: Maybe; running: boolean; status?: Maybe; taskResult?: Maybe; error?: Maybe<{ message?: Maybe; errorCode?: Maybe; errorType?: Maybe; stackTrace?: Maybe }> } }
 
 export type GetDataTransferProcessorsQueryVariables = Exact<{ [key: string]: never }>;
 
@@ -1669,6 +1669,8 @@ export interface AdminUserInfoFragment { userId: string; grantedRoles: string[];
 
 export interface AllNavigatorSettingsFragment { showSystemObjects: boolean; showUtilityObjects: boolean; showOnlyEntities: boolean; mergeEntities: boolean; hideFolders: boolean; hideSchemas: boolean; hideVirtualModel: boolean }
 
+export interface AsyncTaskInfoFragment { id: string; name?: Maybe; running: boolean; status?: Maybe; taskResult?: Maybe; error?: Maybe<{ message?: Maybe; errorCode?: Maybe; errorType?: Maybe; stackTrace?: Maybe }> }
+
 export interface AuthProviderConfigurationParametersFragment { id?: Maybe; displayName?: Maybe; description?: Maybe; category?: Maybe; dataType?: Maybe; value?: Maybe; validValues?: Maybe>>; defaultValue?: Maybe; length: ObjectPropertyLength; features: string[]; order: number }
 
 export interface AuthTokenFragment { authProvider: string; authConfiguration?: Maybe; loginTime: any; message?: Maybe; origin: { type: string; subType?: Maybe; displayName: string; icon?: Maybe; details?: Maybe; displayName?: Maybe; description?: Maybe; category?: Maybe; dataType?: Maybe; defaultValue?: Maybe; validValues?: Maybe>>; value?: Maybe; length: ObjectPropertyLength; features: string[]; order: number }>> } }
@@ -1711,7 +1713,7 @@ export type AsyncReadDataFromContainerMutationVariables = Exact<{
   dataFormat?: Maybe;
 }>;
 
-export interface AsyncReadDataFromContainerMutation { taskInfo: { id: string; name?: Maybe; running: boolean; status?: Maybe; taskResult?: Maybe; error?: Maybe<{ message?: Maybe; errorCode?: Maybe; stackTrace?: Maybe }> } }
+export interface AsyncReadDataFromContainerMutation { taskInfo: { id: string; name?: Maybe; running: boolean; status?: Maybe; taskResult?: Maybe; error?: Maybe<{ message?: Maybe; errorCode?: Maybe; errorType?: Maybe; stackTrace?: Maybe }> } }
 
 export type AsyncSqlExecuteQueryMutationVariables = Exact<{
   connectionId: Scalars['ID'];
@@ -1722,7 +1724,7 @@ export type AsyncSqlExecuteQueryMutationVariables = Exact<{
   dataFormat?: Maybe;
 }>;
 
-export interface AsyncSqlExecuteQueryMutation { taskInfo: { id: string; name?: Maybe; running: boolean; status?: Maybe; taskResult?: Maybe; error?: Maybe<{ message?: Maybe; errorCode?: Maybe; stackTrace?: Maybe }> } }
+export interface AsyncSqlExecuteQueryMutation { taskInfo: { id: string; name?: Maybe; running: boolean; status?: Maybe; taskResult?: Maybe; error?: Maybe<{ message?: Maybe; errorCode?: Maybe; errorType?: Maybe; stackTrace?: Maybe }> } }
 
 export type AsyncSqlExplainExecutionPlanMutationVariables = Exact<{
   connectionId: Scalars['ID'];
@@ -1949,6 +1951,21 @@ export const AdminUserInfoFragmentDoc = `
   }
 }
     ${ObjectOriginInfoFragmentDoc}`;
+export const AsyncTaskInfoFragmentDoc = `
+    fragment AsyncTaskInfo on AsyncTaskInfo {
+  id
+  name
+  running
+  status
+  error {
+    message
+    errorCode
+    errorType
+    stackTrace
+  }
+  taskResult
+}
+    `;
 export const AuthProviderConfigurationParametersFragmentDoc = `
     fragment AuthProviderConfigurationParameters on ObjectPropertyInfo {
   id
@@ -2673,17 +2690,10 @@ export const ExportDataFromContainerDocument = `
     containerNodePath: $containerNodePath
     parameters: $parameters
   ) {
-    id
-    running
-    taskResult
-    error {
-      message
-      errorCode
-      stackTrace
-    }
+    ...AsyncTaskInfo
   }
 }
-    `;
+    ${AsyncTaskInfoFragmentDoc}`;
 export const ExportDataFromResultsDocument = `
     query exportDataFromResults($connectionId: ID!, $contextId: ID!, $resultsId: ID!, $parameters: DataTransferParameters!) {
   taskInfo: dataTransferExportDataFromResults(
@@ -2692,17 +2702,10 @@ export const ExportDataFromResultsDocument = `
     resultsId: $resultsId
     parameters: $parameters
   ) {
-    id
-    running
-    taskResult
-    error {
-      message
-      errorCode
-      stackTrace
-    }
+    ...AsyncTaskInfo
   }
 }
-    `;
+    ${AsyncTaskInfoFragmentDoc}`;
 export const GetDataTransferProcessorsDocument = `
     query getDataTransferProcessors {
   processors: dataTransferAvailableStreamProcessors {
@@ -2757,20 +2760,10 @@ export const NavGetStructContainersDocument = `
 export const GetAsyncTaskInfoDocument = `
     mutation getAsyncTaskInfo($taskId: String!, $removeOnFinish: Boolean!) {
   taskInfo: asyncTaskInfo(id: $taskId, removeOnFinish: $removeOnFinish) {
-    id
-    name
-    running
-    status
-    error {
-      message
-      errorCode
-      errorType
-      stackTrace
-    }
-    taskResult
+    ...AsyncTaskInfo
   }
 }
-    `;
+    ${AsyncTaskInfoFragmentDoc}`;
 export const GetNetworkHandlersDocument = `
     query getNetworkHandlers {
   handlers: networkHandlers {
@@ -2796,19 +2789,10 @@ export const AsyncReadDataFromContainerDocument = `
     filter: $filter
     dataFormat: $dataFormat
   ) {
-    id
-    name
-    running
-    status
-    error {
-      message
-      errorCode
-      stackTrace
-    }
-    taskResult
+    ...AsyncTaskInfo
   }
 }
-    `;
+    ${AsyncTaskInfoFragmentDoc}`;
 export const AsyncSqlExecuteQueryDocument = `
     mutation asyncSqlExecuteQuery($connectionId: ID!, $contextId: ID!, $query: String!, $resultId: ID, $filter: SQLDataFilter, $dataFormat: ResultDataFormat) {
   taskInfo: asyncSqlExecuteQuery(
@@ -2819,19 +2803,10 @@ export const AsyncSqlExecuteQueryDocument = `
     filter: $filter
     dataFormat: $dataFormat
   ) {
-    id
-    name
-    running
-    status
-    error {
-      message
-      errorCode
-      stackTrace
-    }
-    taskResult
+    ...AsyncTaskInfo
   }
 }
-    `;
+    ${AsyncTaskInfoFragmentDoc}`;
 export const AsyncSqlExplainExecutionPlanDocument = `
     mutation asyncSqlExplainExecutionPlan($connectionId: ID!, $contextId: ID!, $query: String!, $configuration: Object!) {
   taskInfo: asyncSqlExplainExecutionPlan(
diff --git a/webapp/packages/plugin-data-export/src/ExportNotification/ExportNotification.tsx b/webapp/packages/plugin-data-export/src/ExportNotification/ExportNotification.tsx
index 8cc48e859a..4b07aa2497 100644
--- a/webapp/packages/plugin-data-export/src/ExportNotification/ExportNotification.tsx
+++ b/webapp/packages/plugin-data-export/src/ExportNotification/ExportNotification.tsx
@@ -22,7 +22,7 @@ import { ExportNotificationController } from './ExportNotificationController';
 
 const styles = css`
   message {
-    font-size: 16px;
+    composes: theme-typography--body1 from global;
     opacity: 0.8;
     overflow: auto;
     max-height: 100px;
diff --git a/webapp/packages/plugin-data-viewer/src/TableViewer/TableError.tsx b/webapp/packages/plugin-data-viewer/src/TableViewer/TableError.tsx
index 68139b5dae..b2a2068719 100644
--- a/webapp/packages/plugin-data-viewer/src/TableViewer/TableError.tsx
+++ b/webapp/packages/plugin-data-viewer/src/TableViewer/TableError.tsx
@@ -143,7 +143,7 @@ export const TableError = observer(function TableViewer({
         
-        {!quote && error.details?.hasDetails && (
+        {error.details?.hasDetails && (
           

From 7b0315c178c13cbb3a833884cdb853d5e8270caf Mon Sep 17 00:00:00 2001
From: Naumov Alexey 
Date: Fri, 26 Nov 2021 13:40:01 +0300
Subject: [PATCH 3/3] feat(core-sdk): CB-1403 group import

---
 webapp/packages/core-sdk/src/getErrorDetails.ts | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/webapp/packages/core-sdk/src/getErrorDetails.ts b/webapp/packages/core-sdk/src/getErrorDetails.ts
index 8f61a471a8..46948b4e3e 100644
--- a/webapp/packages/core-sdk/src/getErrorDetails.ts
+++ b/webapp/packages/core-sdk/src/getErrorDetails.ts
@@ -7,8 +7,7 @@
  */
 
 import { DetailsError } from './DetailsError';
-import { ServerErrorType } from './ServerInternalError';
-import { ServerInternalError } from './ServerInternalError';
+import { ServerErrorType, ServerInternalError } from './ServerInternalError';
 
 export interface IErrorDetails {
   name: string;