file-tree.pug 11 KB

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