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..b67ceca9c5 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?: ServerErrorType; 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 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 73446e102d..46948b4e3e 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 { ServerErrorType, ServerInternalError } from './ServerInternalError'; export interface IErrorDetails { name: string; message: string; hasDetails: boolean; + errorType?: ServerErrorType; } export function hasDetails(error: Error): error is DetailsError { @@ -20,9 +22,19 @@ 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; + 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 d7cd7064d4..f1aa48026e 100644 --- a/webapp/packages/core-sdk/src/queries/getAsyncTaskInfo.gql +++ b/webapp/packages/core-sdk/src/queries/getAsyncTaskInfo.gql @@ -6,15 +6,6 @@ mutation getAsyncTaskInfo( id: $taskId removeOnFinish: $removeOnFinish ) { - id - name - running - status - error { - message - errorCode - 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 e1cad510d5..1dcb1f1dd4 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; } @@ -1634,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']; @@ -1643,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 }>; @@ -1668,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 }>> } } @@ -1695,7 +1698,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 }>; @@ -1710,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']; @@ -1721,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']; @@ -1948,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 @@ -2672,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( @@ -2691,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 { @@ -2756,19 +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 - stackTrace - } - taskResult + ...AsyncTaskInfo } } - `; + ${AsyncTaskInfoFragmentDoc}`; export const GetNetworkHandlersDocument = ` query getNetworkHandlers { handlers: networkHandlers { @@ -2794,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( @@ -2817,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 4be2685ac2..4b07aa2497 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 { + composes: theme-typography--body1 from global; + 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 && (
-        
-      )}
-      
+        {error.details?.hasDetails && (
+          
+        )}
+        
+      
     
   );
 });