pdf.jade 13 KB

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