pdf.pug 14 KB

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