diff --git a/services/web/frontend/extracted-translations.json b/services/web/frontend/extracted-translations.json
index 9e9e9dda7f..a02a213a7a 100644
--- a/services/web/frontend/extracted-translations.json
+++ b/services/web/frontend/extracted-translations.json
@@ -203,6 +203,11 @@
"no_messages": "",
"no_new_commits_in_github": "",
"no_other_projects_found": "",
+ "no_pdf_error_explanation": "",
+ "no_pdf_error_reason_unrecoverable_error": "",
+ "no_pdf_error_reason_no_content": "",
+ "no_pdf_error_reason_output_pdf_already_exists": "",
+ "no_pdf_error_title": "",
"no_preview_available": "",
"no_search_results": "",
"no_symbols_found": "",
@@ -339,4 +344,4 @@
"zotero_reference_loading_error_expired": "",
"zotero_reference_loading_error_forbidden": "",
"zotero_sync_description": ""
-}
+}
\ No newline at end of file
diff --git a/services/web/frontend/js/features/preview/components/preview-error.js b/services/web/frontend/js/features/preview/components/preview-error.js
index a72fca2fb1..3536554e61 100644
--- a/services/web/frontend/js/features/preview/components/preview-error.js
+++ b/services/web/frontend/js/features/preview/components/preview-error.js
@@ -1,5 +1,5 @@
import PropTypes from 'prop-types'
-import { useTranslation } from 'react-i18next'
+import { useTranslation, Trans } from 'react-i18next'
import PreviewLogsPaneEntry from './preview-logs-pane-entry'
import Icon from '../../../shared/components/icon'
import { useEditorContext } from '../../../shared/context/editor-context'
@@ -59,6 +59,30 @@ function PreviewError({ name }) {
} else if (name === 'projectTooLarge') {
errorTitle = t('project_too_large')
errorContent = <>{t('project_too_much_editable_text')}>
+ } else if (name === 'failure') {
+ errorTitle = t('no_pdf_error_title')
+ errorContent = (
+ <>
+
+
+ -
+
+
+ -
+ }}
+ />
+
+ -
+ }}
+ />
+
+
+ >
+ )
}
return errorTitle ? (
diff --git a/services/web/frontend/js/ide/pdf/controllers/PdfController.js b/services/web/frontend/js/ide/pdf/controllers/PdfController.js
index 960c60f585..58953365d6 100644
--- a/services/web/frontend/js/ide/pdf/controllers/PdfController.js
+++ b/services/web/frontend/js/ide/pdf/controllers/PdfController.js
@@ -490,6 +490,7 @@ App.controller(
} else if (response.status === 'failure') {
$scope.pdf.view = 'errors'
$scope.pdf.failure = true
+ $scope.pdf.downloadUrl = null
$scope.shouldShowLogs = true
fetchLogs(fileByPath, { pdfDownloadDomain })
} else if (response.status === 'clsi-maintenance') {
@@ -515,31 +516,38 @@ App.controller(
}
if (window.showNewLogsUI) {
- $scope.pdf.compileFailed = false
- // `$scope.clsiErrors` stores the error states nested within `$scope.pdf`
- // for use with React's
- $scope.clsiErrors = Object.assign(
- {},
- $scope.pdf.error ? { error: true } : null,
- $scope.pdf.renderingError ? { renderingError: true } : null,
- $scope.pdf.clsiMaintenance ? { clsiMaintenance: true } : null,
- $scope.pdf.clsiUnavailable ? { clsiUnavailable: true } : null,
- $scope.pdf.tooRecentlyCompiled ? { tooRecentlyCompiled: true } : null,
- $scope.pdf.compileTerminated ? { compileTerminated: true } : null,
- $scope.pdf.rateLimited ? { rateLimited: true } : null,
- $scope.pdf.compileInProgress ? { compileInProgress: true } : null,
- $scope.pdf.timedout ? { timedout: true } : null,
- $scope.pdf.projectTooLarge ? { projectTooLarge: true } : null,
- $scope.pdf.autoCompileDisabled ? { autoCompileDisabled: true } : null
- )
+ $scope.$applyAsync(() => {
+ $scope.pdf.compileFailed = false
+ // `$scope.clsiErrors` stores the error states nested within `$scope.pdf`
+ // for use with React's
+ $scope.clsiErrors = Object.assign(
+ {},
+ $scope.pdf.error ? { error: true } : null,
+ $scope.pdf.renderingError ? { renderingError: true } : null,
+ $scope.pdf.clsiMaintenance ? { clsiMaintenance: true } : null,
+ $scope.pdf.clsiUnavailable ? { clsiUnavailable: true } : null,
+ $scope.pdf.tooRecentlyCompiled
+ ? { tooRecentlyCompiled: true }
+ : null,
+ $scope.pdf.compileTerminated ? { compileTerminated: true } : null,
+ $scope.pdf.rateLimited ? { rateLimited: true } : null,
+ $scope.pdf.compileInProgress ? { compileInProgress: true } : null,
+ $scope.pdf.timedout ? { timedout: true } : null,
+ $scope.pdf.projectTooLarge ? { projectTooLarge: true } : null,
+ $scope.pdf.autoCompileDisabled
+ ? { autoCompileDisabled: true }
+ : null,
+ $scope.pdf.failure ? { failure: true } : null
+ )
- if (
- $scope.pdf.view === 'errors' ||
- $scope.pdf.view === 'validation-problems'
- ) {
- $scope.shouldShowLogs = true
- $scope.pdf.compileFailed = true
- }
+ if (
+ $scope.pdf.view === 'errors' ||
+ $scope.pdf.view === 'validation-problems'
+ ) {
+ $scope.shouldShowLogs = true
+ $scope.pdf.compileFailed = true
+ }
+ })
}
const IGNORE_FILES = ['output.fls', 'output.fdb_latexmk']
diff --git a/services/web/frontend/stylesheets/app/editor/logs.less b/services/web/frontend/stylesheets/app/editor/logs.less
index 8573b5f117..90eda75052 100644
--- a/services/web/frontend/stylesheets/app/editor/logs.less
+++ b/services/web/frontend/stylesheets/app/editor/logs.less
@@ -175,6 +175,11 @@
}
}
+.log-entry-formatted-content-list {
+ margin: @margin-xs 0;
+ padding-left: @padding-md;
+}
+
.first-error-popup {
position: absolute;
z-index: 1;
diff --git a/services/web/locales/en.json b/services/web/locales/en.json
index b9e8296e9f..9d06715843 100644
--- a/services/web/locales/en.json
+++ b/services/web/locales/en.json
@@ -1,6 +1,11 @@
{
"chat_error": "Could not load chat messages, please try again.",
"reconnect": "Try again",
+ "no_pdf_error_title": "No PDF",
+ "no_pdf_error_explanation": "This compile didn't produce a PDF. This can happen if:",
+ "no_pdf_error_reason_unrecoverable_error": "There is an unrecoverable LaTeX error. If there are LaTeX errors shown below or in the raw logs, please try to fix them and compile again.",
+ "no_pdf_error_reason_no_content": "The document
environment contains no content. If it's empty, please add some content and compile again.",
+ "no_pdf_error_reason_output_pdf_already_exists": "This project contains a file called output.pdf
. If that file exists, please rename it and compile again.",
"logs_pane_info_message": "We are testing a new logs pane",
"logs_pane_info_message_popup": "We are testing a new logs pane. Click here to give feedback.",
"github_symlink_error": "Your Github repository contains symbolic link files, which are not currently supported by Overleaf. Please remove these and try again.",
@@ -1467,4 +1472,4 @@
"page_current": "Page __page__, Current Page",
"go_page": "Go to page __page__",
"pagination_navigation": "Pagination Navigation"
-}
+}
\ No newline at end of file