diff --git a/webapp/package.json b/webapp/package.json index 3805590d252..0b38423a7cd 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -55,4 +55,4 @@ "vitest": "^3" }, "packageManager": "yarn@4.9.2" -} \ No newline at end of file +} diff --git a/webapp/packages/core-blocks/src/useErrorDetails.ts b/webapp/packages/core-blocks/src/useErrorDetails.ts index e78e6830bc0..4c68b218696 100644 --- a/webapp/packages/core-blocks/src/useErrorDetails.ts +++ b/webapp/packages/core-blocks/src/useErrorDetails.ts @@ -26,6 +26,7 @@ interface IErrorDetailsHook { open: () => void; refresh?: () => void; errorCode?: string; + workflowId?: string; } type HookType = @@ -54,9 +55,19 @@ export function useErrorDetails(error: IErrorDetailsHook['error']): HookType { } }; const name = typeof error === 'string' ? translate('core_blocks_exception_message_error_message') : error?.name; - const message = typeof error === 'string' ? error : error?.message; + let message = (typeof error === 'string' ? error : error?.message) ?? undefined; const executionFailedMessage = (error as any)?.execution_failed_message as string; const errorCode = (error as any)?.errorCode as string; + let workflowId: string | undefined; + + if (typeof message === 'string') { + const match = message.match(/workflow_id:(\d+)/); + + if (match) { + workflowId = match[1]; + message = message.replace(/workflow_id:\d+,?\s*/g, '').trim(); + } + } return { name, @@ -69,5 +80,6 @@ export function useErrorDetails(error: IErrorDetailsHook['error']): HookType { refresh: loadingError?.refresh, executionFailedMessage, errorCode, + workflowId, }; } diff --git a/webapp/packages/core-localization/src/locales/en.ts b/webapp/packages/core-localization/src/locales/en.ts index fdb69da8314..91226de4359 100644 --- a/webapp/packages/core-localization/src/locales/en.ts +++ b/webapp/packages/core-localization/src/locales/en.ts @@ -14,6 +14,7 @@ export default [ ['ui_processing_cancel', 'Cancel'], ['ui_processing_canceling', 'Cancelling...'], ['ui_create_workflow', 'Create Workflow'], + ['ui_workflow_detail', 'Workflow Detail'], ['ui_processing_canceled', 'Canceled'], ['ui_processing_reload', 'Reload'], ['ui_processing_retry', 'Retry'], diff --git a/webapp/packages/core-localization/src/locales/zh.ts b/webapp/packages/core-localization/src/locales/zh.ts index 98ff74b3de8..6f6edbff7f7 100644 --- a/webapp/packages/core-localization/src/locales/zh.ts +++ b/webapp/packages/core-localization/src/locales/zh.ts @@ -13,6 +13,7 @@ export default [ ['ui_processing_loading', '加载中...'], ['ui_processing_cancel', '取消'], ['ui_create_workflow', '发起变更工单'], + ['ui_workflow_detail', '工单详情'], ['ui_processing_canceling', '取消中...'], ['ui_processing_canceled', '已取消'], ['ui_processing_retry', '重试'], diff --git a/webapp/packages/plugin-data-viewer/src/TableViewer/TableError.tsx b/webapp/packages/plugin-data-viewer/src/TableViewer/TableError.tsx index 261d98616af..51b1a1368af 100644 --- a/webapp/packages/plugin-data-viewer/src/TableViewer/TableError.tsx +++ b/webapp/packages/plugin-data-viewer/src/TableViewer/TableError.tsx @@ -39,6 +39,8 @@ interface ErrorInfo { show: () => void; } +const WORKFLOW_EXEC_SUCCESS_ERROR_CODE = 'workflow_success'; + export const TableError = observer(function TableError({ model, loading, className }) { const translate = useTranslate(); @@ -68,7 +70,6 @@ export const TableError = observer(function TableError({ model, loading, }, false, ); - const internalServerError = errorOf(model.source.error, ServerInternalError); const error = useErrorDetails(model.source.error); const animated = useStateDelay(!!errorInfo.error && !loading, 1); @@ -94,12 +95,22 @@ export const TableError = observer(function TableError({ model, loading, ); }; + const onWorkflowDetailNavigate = (workflowId: string) => { + const [projectName] = connectionSchemaManagerService.currentConnection?.name.split(':') ?? []; + + window.open(`/transit?from=cloudbeaver&to=workflow_detail&workflow_id=${workflowId}&project_name=${projectName}`); + }; + let icon = '/icons/error_icon.svg'; if (quote) { icon = '/icons/info_icon.svg'; } + if (error.errorCode === WORKFLOW_EXEC_SUCCESS_ERROR_CODE) { + icon = '/icons/success_icon.svg'; + } + let onRetry = () => model.retry(); if (error.refresh) { @@ -176,6 +187,11 @@ export const TableError = observer(function TableError({ model, loading, {error.executionFailedMessage && (
{`${translate('ui_audit_error_tips')}:${error.executionFailedMessage}`}
)} + {error.workflowId && ( +
+ {translate('ui_workflow_id')}: {error.workflowId} +
+ )}
@@ -189,12 +205,20 @@ export const TableError = observer(function TableError({ model, loading, {translate('ui_errors_details')} )} + - + + {error.workflowId ? ( + + ) : ( + + )}
); diff --git a/webapp/packages/product-default/package.json b/webapp/packages/product-default/package.json index 493c1c74611..dfe34e4199d 100644 --- a/webapp/packages/product-default/package.json +++ b/webapp/packages/product-default/package.json @@ -55,4 +55,4 @@ "tailwindcss": "4.0.7", "typescript": "^5" } -} \ No newline at end of file +}