diff --git a/superset-frontend/src/views/CRUD/hooks.ts b/superset-frontend/src/views/CRUD/hooks.ts index cdb0cdc838359..a3de433247fcb 100644 --- a/superset-frontend/src/views/CRUD/hooks.ts +++ b/superset-frontend/src/views/CRUD/hooks.ts @@ -448,7 +448,10 @@ export function useImportResource( t( 'An error occurred while importing %s: %s', resourceLabel, - error.errors.map(payload => payload.message).join('\n'), + [ + ...error.errors.map(payload => payload.message), + t('Please re-export your file and try importing again'), + ].join('\n'), ), ); } else { diff --git a/superset-frontend/src/views/CRUD/utils.test.tsx b/superset-frontend/src/views/CRUD/utils.test.tsx index 68d377e3102cf..dcce0b83697ed 100644 --- a/superset-frontend/src/views/CRUD/utils.test.tsx +++ b/superset-frontend/src/views/CRUD/utils.test.tsx @@ -46,6 +46,25 @@ const terminalErrors = { ], }; +const terminalErrorsWithOnlyIssuesCode = { + errors: [ + { + message: 'Error importing database', + error_type: 'GENERIC_COMMAND_ERROR', + level: 'warning', + extra: { + issue_codes: [ + { + code: 1010, + message: + 'Issue 1010 - Superset encountered an error while running a command.', + }, + ], + }, + }, + ], +}; + const overwriteNeededErrors = { errors: [ { @@ -146,6 +165,12 @@ test('detects if the error message is terminal or if it requires uses interventi expect(isTerminal).toBe(false); }); +test('error message is terminal when the "extra" field contains only the "issue_codes" key', () => { + expect(hasTerminalValidation(terminalErrorsWithOnlyIssuesCode.errors)).toBe( + true, + ); +}); + test('does not ask for password when the import type is wrong', () => { const error = { errors: [ diff --git a/superset-frontend/src/views/CRUD/utils.tsx b/superset-frontend/src/views/CRUD/utils.tsx index 7f069a3e7c712..1a7b3ca1fa721 100644 --- a/superset-frontend/src/views/CRUD/utils.tsx +++ b/superset-frontend/src/views/CRUD/utils.tsx @@ -399,15 +399,17 @@ export const getAlreadyExists = (errors: Record[]) => .flat(); export const hasTerminalValidation = (errors: Record[]) => - errors.some( - error => - !Object.entries(error.extra) - .filter(([key, _]) => key !== 'issue_codes') - .every( - ([_, payload]) => - isNeedsPassword(payload) || isAlreadyExists(payload), - ), - ); + errors.some(error => { + const noIssuesCodes = Object.entries(error.extra).filter( + ([key]) => key !== 'issue_codes', + ); + + if (noIssuesCodes.length === 0) return true; + + return !noIssuesCodes.every( + ([, payload]) => isNeedsPassword(payload) || isAlreadyExists(payload), + ); + }); export const checkUploadExtensions = ( perm: Array,