file-tree.pug 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. aside.editor-sidebar.full-size(
  2. ng-controller="FileTreeController"
  3. ng-class="{ 'multi-selected': multiSelectedCount > 0 }"
  4. ng-show="ui.view != 'history' || !history.isV2"
  5. vertical-resizable-panes=user.betaProgram && "outline-resizer"
  6. vertical-resizable-panes-toggled-externally-on=user.betaProgram && "outline-toggled"
  7. vertical-resizable-panes-min-size=user.betaProgram && "32"
  8. vertical-resizable-panes-max-size=user.betaProgram && "75%"
  9. )
  10. .file-tree(
  11. vertical-resizable-top=user.betaProgram
  12. )
  13. .toolbar.toolbar-filetree(ng-if="permissions.write")
  14. a(
  15. href,
  16. ng-click="openNewDocModal()",
  17. tooltip-html="'"+translate('new_file').replace(' ', '<br>')+"'",
  18. tooltip-placement="bottom"
  19. )
  20. i.fa.fa-fw.fa-file
  21. a(
  22. href,
  23. ng-click="openNewFolderModal()",
  24. tooltip-html="'"+translate('new_folder').replace(' ', '<br>')+"'",
  25. tooltip-placement="bottom"
  26. )
  27. i.fa.fa-fw.fa-folder
  28. a(
  29. href,
  30. ng-click="openUploadFileModal()",
  31. tooltip=translate('upload'),
  32. tooltip-placement="bottom"
  33. )
  34. i.fa.fa-fw.fa-upload
  35. .toolbar-right
  36. a(
  37. href,
  38. ng-click="startRenamingSelected()",
  39. tooltip=translate('rename'),
  40. tooltip-placement="bottom",
  41. ng-show="multiSelectedCount == 0"
  42. )
  43. i.fa.fa-fw.fa-pencil
  44. a(
  45. href,
  46. ng-click="openDeleteModalForSelected()",
  47. tooltip=translate('delete'),
  48. tooltip-placement="bottom",
  49. tooltip-append-to-body="true"
  50. )
  51. i.fa.fa-fw.fa-trash-o
  52. .file-tree-inner(
  53. ng-if="rootFolder",
  54. ng-controller="FileTreeRootFolderController",
  55. ng-class="{ 'no-toolbar': !permissions.write }"
  56. )
  57. ul.list-unstyled.file-tree-list(
  58. droppable="permissions.write"
  59. accept=".entity-name"
  60. on-drop-callback="onDrop"
  61. )
  62. li(
  63. ng-show="ui.pdfLayout == 'flat' && (ui.view == 'editor' || ui.view == 'pdf' || ui.view == 'file')"
  64. ng-class="{ 'selected': ui.view == 'pdf' }"
  65. ng-controller="PdfViewToggleController"
  66. )
  67. .entity
  68. .entity-name(
  69. ng-click="togglePdfView()"
  70. )
  71. i.fa.fa-fw.toggle
  72. i.fa.fa-fw.fa-file-pdf-o
  73. | PDF
  74. file-entity(
  75. entity="entity",
  76. permissions="permissions",
  77. ng-repeat="entity in rootFolder.children | orderBy:[orderByFoldersFirst, 'name']"
  78. )
  79. li(ng-show="deletedDocs.length > 0 && ui.view == 'history'")
  80. h3 #{translate("deleted_files")}
  81. li(
  82. ng-class="{ 'selected': entity.selected }",
  83. ng-repeat="entity in deletedDocs | orderBy:'name'",
  84. ng-controller="FileTreeEntityController",
  85. ng-show="ui.view == 'history'"
  86. )
  87. .entity
  88. .entity-name(
  89. ng-click="select($event)"
  90. )
  91. //- Just a spacer to align with folders
  92. i.fa.fa-fw.toggle
  93. i.fa.fa-fw.fa-file
  94. span {{ entity.name }}
  95. if user.betaProgram
  96. .outline-container(
  97. vertical-resizable-bottom
  98. ng-controller="OutlineController"
  99. )
  100. outline-pane(
  101. is-tex-file="isTexFile"
  102. outline="outline"
  103. project-id="project_id"
  104. jump-to-line="jumpToLine"
  105. on-toggle="onToggle"
  106. event-tracking="eventTracking"
  107. highlighted-line="highlightedLine"
  108. )
  109. script(type='text/ng-template', id='entityListItemTemplate')
  110. li(
  111. ng-class="{ 'selected': entity.selected, 'multi-selected': entity.multiSelected }",
  112. ng-controller="FileTreeEntityController"
  113. )
  114. .entity(ng-if="entity.type != 'folder'")
  115. .entity-name(
  116. ng-click="select($event)"
  117. ng-dblclick="permissions.write && startRenaming()"
  118. draggable="permissions.write"
  119. draggable-helper="draggableHelper"
  120. context-menu
  121. data-target="context-menu-{{ entity.id }}"
  122. context-menu-container="body"
  123. context-menu-disabled="!permissions.write"
  124. )
  125. //- Just a spacer to align with folders
  126. i.fa.fa-fw.toggle(ng-if="entity.type != 'folder'")
  127. i.fa.fa-fw(ng-if="entity.type != 'folder'", ng-class="'fa-' + iconTypeFromName(entity.name)")
  128. i.fa.fa-external-link-square.fa-rotate-180.linked-file-highlight(
  129. ng-if="entity.linkedFileData.provider"
  130. )
  131. span(
  132. ng-hide="entity.renaming"
  133. ) {{ entity.renamingToName || entity.name }}
  134. span.rename-input
  135. input(
  136. ng-if="permissions.write",
  137. ng-show="entity.renaming",
  138. ng-model="inputs.name",
  139. ng-blur="finishRenaming()",
  140. select-name-when="entity.renaming",
  141. on-enter="finishRenaming()"
  142. valid-file
  143. )
  144. span.dropdown.entity-menu-toggle(
  145. dropdown,
  146. ng-if="permissions.write"
  147. )
  148. a.dropdown-toggle(href, dropdown-toggle, stop-propagation="click")
  149. i.fa.fa-chevron-down
  150. ul.dropdown-menu.dropdown-menu-right
  151. li
  152. a(
  153. href
  154. ng-click="startRenaming()"
  155. right-click="startRenaming()"
  156. ng-show="!entity.multiSelected"
  157. ) #{translate("rename")}
  158. li
  159. a(
  160. href
  161. ng-click="openDeleteModal()"
  162. right-click="openDeleteModal()"
  163. stop-propagation="click"
  164. ) #{translate("delete")}
  165. div.dropdown.context-menu(
  166. id="context-menu-{{ entity.id }}",
  167. ng-if="permissions.write"
  168. )
  169. ul.dropdown-menu
  170. li
  171. a(
  172. href
  173. ng-click="startRenaming()"
  174. right-click="startRenaming()"
  175. ng-show="!entity.multiSelected"
  176. ) #{translate("rename")}
  177. li
  178. a(
  179. href
  180. ng-click="openDeleteModal()"
  181. right-click="openDeleteModal()"
  182. stop-propagation="click"
  183. ) #{translate("delete")}
  184. .entity(ng-if="entity.type == 'folder'", ng-controller="FileTreeFolderController")
  185. .entity-name(
  186. ng-click="select($event)"
  187. ng-dblclick="permissions.write && startRenaming()"
  188. draggable="permissions.write"
  189. draggable-helper="draggableHelper"
  190. droppable="permissions.write"
  191. accept=".entity-name"
  192. on-drop-callback="onDrop"
  193. )
  194. div(
  195. context-menu
  196. data-target="context-menu-{{ entity.id }}"
  197. context-menu-container="body"
  198. context-menu-disabled="!permissions.write"
  199. )
  200. i.fa.fa-fw.toggle(
  201. ng-if="entity.type == 'folder'"
  202. ng-class="{'fa-chevron-right': !expanded, 'fa-chevron-down': expanded}"
  203. ng-click="toggleExpanded()"
  204. )
  205. i.fa.fa-fw(
  206. ng-if="entity.type == 'folder'"
  207. ng-class="{\
  208. 'fa-folder': !expanded, \
  209. 'fa-folder-open': expanded \
  210. }"
  211. ng-click="select($event)"
  212. )
  213. span(
  214. ng-hide="entity.renaming"
  215. ) {{ entity.renamingToName || entity.name }}
  216. span.rename-input
  217. input(
  218. ng-if="permissions.write",
  219. ng-show="entity.renaming",
  220. ng-model="inputs.name",
  221. ng-blur="finishRenaming()",
  222. select-name-when="entity.renaming",
  223. on-enter="finishRenaming()"
  224. valid-file
  225. )
  226. span.dropdown.entity-menu-toggle(
  227. dropdown,
  228. ng-if="permissions.write"
  229. )
  230. a.dropdown-toggle(href, dropdown-toggle, stop-propagation="click")
  231. i.fa.fa-chevron-down
  232. ul.dropdown-menu.dropdown-menu-right
  233. li
  234. a(
  235. href
  236. ng-click="startRenaming()"
  237. right-click="startRenaming()"
  238. ng-show="!entity.multiSelected"
  239. ) #{translate("rename")}
  240. li
  241. a(
  242. href
  243. ng-click="openDeleteModal()"
  244. right-click="openDeleteModal()"
  245. stop-propagation="click"
  246. ) #{translate("delete")}
  247. li.divider
  248. li
  249. a(
  250. href
  251. ng-click="openNewDocModal()"
  252. right-click="openNewDocModal()"
  253. ) #{translate("new_file")}
  254. li
  255. a(
  256. href
  257. ng-click="openNewFolderModal()"
  258. right-click="openNewFolderModal()"
  259. ) #{translate("new_folder")}
  260. li
  261. a(
  262. href
  263. ng-click="openUploadFileModal()"
  264. right-click="openUploadFileModal()"
  265. ) #{translate("upload_file")}
  266. .dropdown.context-menu(
  267. ng-if="permissions.write"
  268. id="context-menu-{{ entity.id }}"
  269. )
  270. ul.dropdown-menu
  271. li
  272. a(
  273. href
  274. ng-click="startRenaming()"
  275. right-click="startRenaming()"
  276. ng-show="!entity.multiSelected"
  277. ) #{translate("rename")}
  278. li
  279. a(
  280. href
  281. ng-click="openDeleteModal()"
  282. right-click="openDeleteModal()"
  283. stop-propagation="click"
  284. ) #{translate("delete")}
  285. li.divider
  286. li
  287. a(
  288. href
  289. ng-click="openNewDocModal()"
  290. right-click="openNewDocModal()"
  291. ) #{translate("new_file")}
  292. li
  293. a(
  294. href
  295. ng-click="openNewFolderModal()"
  296. right-click="openNewFolderModal()"
  297. ) #{translate("new_folder")}
  298. li
  299. a(
  300. href
  301. ng-click="openUploadFileModal()"
  302. right-click="openUploadFileModal()"
  303. ) #{translate("upload_file")}
  304. ul.list-unstyled(
  305. ng-if="entity.type == 'folder'"
  306. ng-show="expanded"
  307. droppable="permissions.write"
  308. accept=".entity-name"
  309. on-drop-callback="onDrop"
  310. )
  311. file-entity(
  312. entity="child",
  313. permissions="permissions",
  314. ng-repeat="child in entity.children | orderBy:[orderByFoldersFirst, 'name']"
  315. )
  316. script(type='text/ng-template', id='newFolderModalTemplate')
  317. .modal-header
  318. h3 #{translate("new_folder")}
  319. .modal-body
  320. form(novalidate, name="newFolderForm")
  321. input.form-control(
  322. type="text",
  323. placeholder="Folder Name",
  324. required,
  325. ng-model="inputs.name",
  326. on-enter="create()",
  327. select-name-on="open",
  328. valid-file,
  329. name="name"
  330. )
  331. div.alert.alert-danger.row-spaced-small(ng-show="newFolderForm.name.$error.validFile")
  332. | #{translate('files_cannot_include_invalid_characters')}
  333. div.alert.alert-danger.row-spaced-small(ng-if="error")
  334. div(ng-switch="error")
  335. span(ng-switch-when="already exists") #{translate("file_already_exists")}
  336. span(ng-switch-default) {{error}}
  337. .modal-footer
  338. button.btn.btn-default(
  339. ng-disabled="state.inflight"
  340. ng-click="cancel()"
  341. ) #{translate("cancel")}
  342. button.btn.btn-primary(
  343. ng-disabled="newFolderForm.$invalid || state.inflight"
  344. ng-click="create()"
  345. )
  346. span(ng-hide="state.inflight") #{translate("create")}
  347. span(ng-show="state.inflight") #{translate("creating")}…
  348. script(type='text/ng-template', id='duplicateFileModalTemplate')
  349. .modal-header
  350. h3 #{translate("duplicate_file")}
  351. .modal-body
  352. p #{translate("file_already_exists_in_this_location", { fileName: "'{{ fileName }}'" })}
  353. .modal-footer
  354. button.btn.btn-default(
  355. ng-click="cancel()"
  356. ) #{translate("dismiss")}
  357. include ./new-file-modal
  358. script(type='text/ng-template', id='deleteEntityModalTemplate')
  359. .modal-header
  360. h3 #{translate("delete")} {{ entity.name }}
  361. .modal-body
  362. p !{translate("sure_you_want_to_delete")}
  363. ul
  364. li(ng-repeat="entity in entities") {{entity.name}}
  365. .modal-footer
  366. button.btn.btn-default(
  367. ng-disabled="state.inflight"
  368. ng-click="cancel()"
  369. ) #{translate("cancel")}
  370. button.btn.btn-danger(
  371. ng-disabled="state.inflight"
  372. ng-click="delete()"
  373. )
  374. span(ng-hide="state.inflight") #{translate("delete")}
  375. span(ng-show="state.inflight") #{translate("deleting")}…
  376. script(type='text/ng-template', id='invalidFileNameModalTemplate')
  377. .modal-header
  378. h3 #{translate('invalid_file_name')}
  379. .modal-body
  380. p #{translate('files_cannot_include_invalid_characters')}
  381. .modal-footer
  382. button.btn.btn-default(
  383. ng-click="$close()"
  384. ) #{translate('ok')}