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 && (
+          
+        )}
+        
+      
     
   );
 });