pdf.pug 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. div.full-size.pdf(ng-controller="PdfController")
  2. if showNewLogsUI
  3. preview-pane(
  4. compiler-state=`{
  5. autoCompileHasChanges: changesToAutoCompile,
  6. autoCompileHasLintingError: autoCompileLintingError,
  7. isAutoCompileOn: autocompile_enabled,
  8. isClearingCache: pdf.clearingCache,
  9. isCompiling: pdf.compiling,
  10. isDraftModeOn: draft,
  11. isSyntaxCheckOn: stop_on_validation_error,
  12. lastCompileTimestamp: pdf.lastCompileTimestamp,
  13. logEntries: pdf.logEntries,
  14. validationIssues: pdf.validation,
  15. errors: clsiErrors,
  16. rawLog: pdf.rawLog,
  17. compileFailed: pdf.compileFailed
  18. }`
  19. on-clear-cache="clearCache"
  20. on-recompile="recompile"
  21. on-recompile-from-scratch="recompileFromScratch"
  22. on-run-syntax-check-now="runSyntaxCheckNow"
  23. on-set-auto-compile="setAutoCompile"
  24. on-set-draft-mode="setDraftMode"
  25. on-set-syntax-check="setSyntaxCheck"
  26. on-toggle-logs="toggleLogs"
  27. output-files="pdf.outputFiles"
  28. pdf-download-url="pdf.downloadUrl"
  29. split-layout="ui.pdfLayout === 'sideBySide'"
  30. on-set-split-layout="setPdfSplitLayout"
  31. on-set-full-layout="setPdfFullLayout"
  32. on-stop-compilation="stop"
  33. variant-with-first-error-popup="logsUISubvariant === 'new-logs-ui-with-popup'"
  34. show-logs="shouldShowLogs"
  35. on-log-entry-location-click="openInEditor"
  36. )
  37. else
  38. .toolbar.toolbar-pdf(ng-class="{ 'changes-to-autocompile': changesToAutoCompile && !autoCompileLintingError }")
  39. .btn-group.btn-recompile-group#recompile(
  40. dropdown,
  41. tooltip-html="'"+translate('recompile_pdf')+" <span class=\"keyboard-shortcut\">({{modifierKey}} + Enter)</span>'"
  42. tooltip-class="keyboard-tooltip"
  43. tooltip-popup-delay="500"
  44. tooltip-append-to-body="true"
  45. tooltip-placement="bottom"
  46. )
  47. a.btn.btn-recompile(
  48. href,
  49. ng-disabled="pdf.compiling",
  50. ng-click="recompile()"
  51. )
  52. i.fa.fa-refresh(
  53. ng-class="{'fa-spin': pdf.compiling }"
  54. )
  55. span.btn-recompile-label(ng-show="!pdf.compiling") #{translate("recompile")}
  56. span.btn-recompile-label(ng-show="pdf.compiling") #{translate("compiling")}…
  57. a.btn.btn-recompile.dropdown-toggle(
  58. href,
  59. ng-disabled="pdf.compiling",
  60. dropdown-toggle
  61. )
  62. span.caret
  63. ul.dropdown-menu.dropdown-menu-left
  64. li.dropdown-header #{translate("auto_compile")}
  65. li
  66. a(href, ng-click="autocompile_enabled = true")
  67. i.fa.fa-fw(ng-class="{'fa-check': autocompile_enabled}")
  68. | &nbsp;#{translate('on')}
  69. li
  70. a(href, ng-click="autocompile_enabled = false")
  71. i.fa.fa-fw(ng-class="{'fa-check': !autocompile_enabled}")
  72. | &nbsp;#{translate('off')}
  73. li.dropdown-header #{translate("compile_mode")}
  74. li
  75. a(href, ng-click="draft = false")
  76. i.fa.fa-fw(ng-class="{'fa-check': !draft}")
  77. | &nbsp;#{translate("normal")}
  78. li
  79. a(href, ng-click="draft = true")
  80. i.fa.fa-fw(ng-class="{'fa-check': draft}")
  81. | &nbsp;#{translate("fast")}&nbsp;
  82. span.subdued [draft]
  83. li.dropdown-header #{translate("compile_time_checks")}
  84. li
  85. a(href, ng-click="stop_on_validation_error = true")
  86. i.fa.fa-fw(ng-class="{'fa-check': stop_on_validation_error}")
  87. | &nbsp;#{translate("stop_on_validation_error")}
  88. li
  89. a(href, ng-click="stop_on_validation_error = false")
  90. i.fa.fa-fw(ng-class="{'fa-check': !stop_on_validation_error}")
  91. | &nbsp;#{translate("ignore_validation_errors")}
  92. li
  93. a(href, ng-click="recompile({check:true})")
  94. i.fa.fa-fw()
  95. | &nbsp;#{translate("run_syntax_check_now")}
  96. a(
  97. href
  98. ng-click="stop()"
  99. ng-show="pdf.compiling",
  100. tooltip=translate('stop_compile')
  101. tooltip-placement="bottom"
  102. )
  103. i.fa.fa-fw.fa-stop()
  104. a.log-btn(
  105. href
  106. ng-click="toggleLogs()"
  107. ng-class="{ 'active': shouldShowLogs == true }"
  108. tooltip=translate('logs_and_output_files')
  109. tooltip-placement="bottom"
  110. )
  111. i.fa.fa-fw.fa-file-text-o
  112. span.label(
  113. ng-show="pdf.logEntries.warnings.length + pdf.logEntries.errors.length > 0"
  114. ng-class="{\
  115. 'label-warning': pdf.logEntries.errors.length == 0,\
  116. 'label-danger': pdf.logEntries.errors.length > 0\
  117. }"
  118. ) {{ pdf.logEntries.errors.length + pdf.logEntries.warnings.length }}
  119. a(
  120. ng-if="!pdf.downloadUrl"
  121. disabled
  122. href="#"
  123. tooltip=translate('please_compile_pdf_before_download')
  124. tooltip-placement="bottom"
  125. )
  126. i.fa.fa-fw.fa-download
  127. a(
  128. ng-href="{{pdf.downloadUrl || pdf.url}}"
  129. target="_blank"
  130. ng-if="pdf.url"
  131. tooltip=translate('download_pdf')
  132. tooltip-placement="bottom"
  133. )
  134. i.fa.fa-fw.fa-download
  135. .toolbar-right
  136. span.auto-compile-status.small(
  137. ng-show="changesToAutoCompile && !compiling && !autoCompileLintingError"
  138. ) #{translate('uncompiled_changes')}
  139. span.auto-compile-status.auto-compile-error.small(
  140. ng-show="autoCompileLintingError"
  141. tooltip-placement="bottom"
  142. tooltip=translate("code_check_failed_explanation")
  143. tooltip-append-to-body="true"
  144. )
  145. i.fa.fa-fw.fa-exclamation-triangle
  146. |
  147. | #{translate("code_check_failed")}
  148. a(
  149. href,
  150. ng-click="switchToFlatLayout('pdf')"
  151. ng-show="ui.pdfLayout == 'sideBySide'"
  152. tooltip=translate('full_screen')
  153. tooltip-placement="bottom"
  154. tooltip-append-to-body="true"
  155. )
  156. i.fa.fa-expand
  157. a(
  158. href,
  159. ng-click="switchToSideBySideLayout('editor')"
  160. ng-show="ui.pdfLayout == 'flat'"
  161. tooltip=translate('split_screen')
  162. tooltip-placement="bottom"
  163. tooltip-append-to-body="true"
  164. )
  165. i.fa.fa-compress
  166. // end of toolbar
  167. // logs view
  168. .pdf-logs(ng-show="shouldShowLogs")
  169. .alert.alert-success(ng-show="pdf.logEntries.all.length == 0 && !pdf.failure")
  170. | #{translate("no_errors_good_job")}
  171. .alert.alert-danger(ng-show="pdf.failure")
  172. strong #{translate("compile_error")}.
  173. span #{translate("generic_failed_compile_message")}.
  174. .alert.alert-danger(ng-show="pdf.failedCheck")
  175. strong #{translate("failed_compile_check")}.
  176. p
  177. p.text-center(ng-show="!check")
  178. a.text-info(
  179. href,
  180. ng-disabled="pdf.compiling",
  181. ng-click="recompile({try:true})"
  182. ) #{translate("failed_compile_check_try")}
  183. | &#32;#{translate("failed_compile_option_or")}&#32;
  184. a.text-info(
  185. href,
  186. ng-disabled="pdf.compiling",
  187. ng-click="recompile({force:true})"
  188. ) #{translate("failed_compile_check_ignore")}
  189. | .
  190. div(ng-repeat="entry in pdf.logEntries.all")
  191. .alert(
  192. ng-class="{\
  193. 'alert-danger': entry.level == 'error',\
  194. 'alert-warning': entry.level == 'warning',\
  195. 'alert-info': entry.level == 'typesetting'\
  196. }"
  197. ng-click="openInEditor(entry)"
  198. )
  199. span.line-no
  200. i.fa.fa-link(aria-hidden="true")
  201. | &nbsp;
  202. span(ng-show="entry.file") {{ entry.file }}
  203. span(ng-show="entry.line") , line {{ entry.line }}
  204. p.entry-message(ng-show="entry.message")
  205. | {{ entry.type }} {{ entry.message }}
  206. .card.card-hint(
  207. ng-if="entry.humanReadableHint"
  208. stop-propagation="click"
  209. )
  210. figure.card-hint-icon-container
  211. i.fa.fa-lightbulb-o(aria-hidden="true")
  212. p.card-hint-text(
  213. ng-show="entry.humanReadableHint",
  214. ng-bind-html="entry.humanReadableHint")
  215. .card-hint-footer.clearfix
  216. .card-hint-ext-link(ng-if="entry.extraInfoURL")
  217. a(
  218. ng-href="{{ entry.extraInfoURL }}",
  219. ng-click="trackLogHintsLearnMore()"
  220. target="_blank"
  221. )
  222. i.fa.fa-external-link
  223. |&nbsp;#{translate("log_hint_extra_info")}
  224. p.entry-content(ng-show="entry.content") {{ entry.content.trim() }}
  225. div
  226. .files-dropdown-container
  227. a.btn.btn-default.btn-sm(
  228. href,
  229. tooltip=translate('clear_cached_files'),
  230. tooltip-placement="top",
  231. tooltip-append-to-body="true",
  232. ng-click="openClearCacheModal()"
  233. )
  234. i.fa.fa-trash-o
  235. | &nbsp;
  236. div.files-dropdown(
  237. ng-class="shouldDropUp ? 'dropup' : 'dropdown'"
  238. dropdown
  239. )
  240. a.btn.btn-default.btn-sm(
  241. href
  242. dropdown-toggle
  243. )
  244. | #{translate("other_logs_and_files")}
  245. span.caret
  246. ul.dropdown-menu.dropdown-menu-right
  247. li(ng-repeat="file in pdf.outputFiles")
  248. a(
  249. href="{{file.url}}"
  250. target="_blank"
  251. ) {{ file.name }}
  252. a.btn.btn-info.btn-sm(href, ng-click="toggleRawLog()")
  253. span(ng-show="!pdf.showRawLog") #{translate("view_raw_logs")}
  254. span(ng-show="pdf.showRawLog") #{translate("hide_raw_logs")}
  255. pre(ng-bind="pdf.rawLog", ng-show="pdf.showRawLog")
  256. // non-log views (pdf and errors)
  257. div(ng-show="!shouldShowLogs", ng-switch on="pdf.view")
  258. .pdf-uncompiled(ng-switch-when="uncompiled" ng-show="!pdf.compiling")
  259. | &nbsp;
  260. i.fa.fa-level-up.fa-flip-horizontal.fa-2x
  261. | &nbsp;&nbsp;#{translate('click_here_to_preview_pdf')}
  262. .pdf-viewer(ng-switch-when="pdf")
  263. div(
  264. pdfng
  265. ng-if="settings.pdfViewer == 'pdfjs'"
  266. pdf-src="pdf.url"
  267. key="{{ project_id }}"
  268. resize-on="layout:main:resize,layout:pdf:resize"
  269. highlights="pdf.highlights"
  270. position="pdf.position"
  271. dbl-click-callback="syncToCode"
  272. )
  273. iframe(
  274. ng-src="{{ pdf.url | trusted }}"
  275. ng-if="settings.pdfViewer == 'native'"
  276. )
  277. if !showNewLogsUI
  278. .pdf-validation-problems(ng-switch-when="validation-problems")
  279. .alert.alert-danger(ng-show="pdf.validation.sizeCheck")
  280. strong #{translate("project_too_large")}
  281. div #{translate("project_too_large_please_reduce")}
  282. div
  283. li(ng-repeat="entry in pdf.validation.sizeCheck.resources") {{ '/'+entry['path'] }} - {{entry['kbSize']}}kb
  284. .alert.alert-danger(ng-show="pdf.validation.conflictedPaths")
  285. div
  286. strong #{translate("conflicting_paths_found")}
  287. div !{translate("following_paths_conflict")}
  288. div
  289. li(ng-repeat="entry in pdf.validation.conflictedPaths") {{ '/'+entry['path'] }}
  290. .alert.alert-danger(ng-show="pdf.validation.mainFile")
  291. strong #{translate("main_file_not_found")}
  292. span #{translate("please_set_main_file")}
  293. .pdf-errors(ng-switch-when="errors")
  294. .alert.alert-danger(ng-show="pdf.error")
  295. strong #{translate("server_error")}
  296. span #{translate("somthing_went_wrong_compiling")}
  297. .alert.alert-danger(ng-show="pdf.renderingError")
  298. strong #{translate("pdf_rendering_error")}
  299. span #{translate("something_went_wrong_rendering_pdf")}
  300. .alert.alert-danger(ng-show="pdf.clsiMaintenance")
  301. strong #{translate("server_error")}
  302. span #{translate("clsi_maintenance")}
  303. .alert.alert-danger(ng-show="pdf.clsiUnavailable")
  304. strong #{translate("server_error")}
  305. span #{translate("clsi_unavailable")}
  306. .alert.alert-danger(ng-show="pdf.tooRecentlyCompiled")
  307. strong #{translate("server_error")}
  308. span #{translate("too_recently_compiled")}
  309. .alert.alert-danger(ng-show="pdf.compileTerminated")
  310. strong #{translate("terminated")}.
  311. span #{translate("compile_terminated_by_user")}
  312. .alert.alert-danger(ng-show="pdf.rateLimited")
  313. strong #{translate("pdf_compile_rate_limit_hit")}
  314. span #{translate("project_flagged_too_many_compiles")}
  315. .alert.alert-danger(ng-show="pdf.compileInProgress")
  316. strong #{translate("pdf_compile_in_progress_error")}.
  317. span #{translate("pdf_compile_try_again")}
  318. .alert.alert-danger(ng-show="pdf.timedout")
  319. p
  320. strong #{translate("timedout")}.
  321. span #{translate("proj_timed_out_reason")}
  322. p
  323. a.text-info(href="https://www.sharelatex.com/learn/Debugging_Compilation_timeout_errors", target="_blank")
  324. | #{translate("learn_how_to_make_documents_compile_quickly")}
  325. if settings.enableSubscriptions
  326. .alert.alert-success(ng-show="pdf.timedout && !hasPremiumCompile")
  327. p(ng-if="project.owner._id == user.id")
  328. strong #{translate("upgrade_for_longer_compiles")}
  329. p(ng-if="project.owner._id != user.id")
  330. strong #{translate("ask_proj_owner_to_upgrade_for_longer_compiles")}
  331. p #{translate("free_accounts_have_timeout_upgrade_to_increase")}
  332. p #{translate("plus_upgraded_accounts_receive")}:
  333. div
  334. ul.list-unstyled
  335. li
  336. i.fa.fa-check &nbsp;
  337. | #{translate("unlimited_projects")}
  338. li
  339. i.fa.fa-check &nbsp;
  340. | #{translate("collabs_per_proj", {collabcount:'Multiple'})}
  341. li
  342. i.fa.fa-check &nbsp;
  343. | #{translate("full_doc_history")}
  344. li
  345. i.fa.fa-check &nbsp;
  346. | #{translate("sync_to_dropbox")}
  347. li
  348. i.fa.fa-check &nbsp;
  349. | #{translate("sync_to_github")}
  350. li
  351. i.fa.fa-check &nbsp;
  352. |#{translate("compile_larger_projects")}
  353. p(ng-controller="FreeTrialModalController", ng-if="project.owner._id == user.id")
  354. a.btn.btn-success.row-spaced-small(
  355. href
  356. ng-class="buttonClass"
  357. ng-click="startFreeTrial('compile-timeout')"
  358. ) #{translate("start_free_trial")}
  359. .alert.alert-danger(ng-show="pdf.autoCompileDisabled")
  360. p
  361. strong #{translate("autocompile_disabled")}.
  362. span #{translate("autocompile_disabled_reason")}
  363. .alert.alert-danger(ng-show="pdf.projectTooLarge")
  364. strong #{translate("project_too_large")}
  365. span #{translate("project_too_large_please_reduce")}
  366. script(type='text/ng-template', id='clearCacheModalTemplate')
  367. .modal-header
  368. h3 #{translate("clear_cache")}?
  369. .modal-body
  370. p #{translate("clear_cache_explanation")}
  371. p #{translate("clear_cache_is_safe")}
  372. .alert.alert-danger(ng-if="state.error") #{translate("generic_something_went_wrong")}.
  373. .modal-footer
  374. button.btn.btn-default(
  375. ng-click="cancel()"
  376. ng-disabled="state.inflight"
  377. ) #{translate("cancel")}
  378. button.btn.btn-info(
  379. ng-click="clear()"
  380. ng-disabled="state.inflight"
  381. )
  382. span(ng-show="!state.inflight") #{translate("clear_cache")}
  383. span(ng-show="state.inflight") #{translate("clearing")}…
  384. script(type="text/javascript", nonce=scriptNonce).
  385. window.showNewLogsUI = #{showNewLogsUI || false}
  386. window.logsUISubvariant = !{logsUISubvariant ? '"' + logsUISubvariant + '"' : 'null'}