file-tree.jade 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. aside#file-tree(ng-controller="FileTreeController", ng-class="{ 'multi-selected': multiSelectedCount > 0 }").full-size
  2. .toolbar.toolbar-small.toolbar-alt(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-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-folder
  17. a(
  18. href,
  19. ng-click="openUploadFileModal()",
  20. tooltip="#{translate('upload')}",
  21. tooltip-placement="bottom"
  22. )
  23. i.fa.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-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-trash-o
  41. .file-tree-inner(
  42. ng-if="rootFolder",
  43. ng-controller="FileTreeRootFolderController",
  44. ng-class="{ 'no-toolbar': !permissions.write }"
  45. )
  46. div(ng-show="ui.pdfLayout == 'flat' && (ui.view == 'editor' || ui.view == 'pdf' || ui.view == 'file')")
  47. ul.list-unstyled.file-tree-list
  48. li(
  49. ng-class="{ 'selected': ui.view == 'pdf' }"
  50. ng-controller="PdfViewToggleController"
  51. )
  52. .entity
  53. .entity-name(
  54. ng-click="togglePdfView()"
  55. )
  56. i.fa.fa-fw.toggle
  57. i.fa.fa-fw.fa-file-pdf-o
  58. | PDF
  59. ul.list-unstyled.file-tree-list(
  60. droppable="permissions.write"
  61. accept=".entity-name"
  62. on-drop-callback="onDrop"
  63. )
  64. file-entity(
  65. entity="entity",
  66. permissions="permissions",
  67. ng-repeat="entity in rootFolder.children | orderBy:[orderByFoldersFirst, 'name']"
  68. )
  69. div(ng-show="deletedDocs.length > 0 && ui.view == 'track-changes'")
  70. h3 #{translate("deleted_files")}
  71. ul.list-unstyled.file-tree-list.deleted-docs
  72. li(
  73. ng-class="{ 'selected': entity.selected }",
  74. ng-repeat="entity in deletedDocs | orderBy:'name'",
  75. ng-controller="FileTreeEntityController"
  76. )
  77. .entity
  78. .entity-name(
  79. ng-click="select($event)"
  80. )
  81. //- Just a spacer to align with folders
  82. i.fa.fa-fw.toggle
  83. i.fa.fa-fw.fa-file
  84. span {{ entity.name }}
  85. script(type='text/ng-template', id='entityListItemTemplate')
  86. li(
  87. ng-class="{ 'selected': entity.selected, 'multi-selected': entity.multiSelected }",
  88. ng-controller="FileTreeEntityController"
  89. )
  90. .entity(ng-if="entity.type != 'folder'")
  91. .entity-name(
  92. ng-click="select($event)"
  93. ng-dblclick="permissions.write && startRenaming()"
  94. draggable="permissions.write"
  95. draggable-helper="draggableHelper"
  96. context-menu
  97. data-target="context-menu-{{ entity.id }}"
  98. context-menu-container="body"
  99. context-menu-disabled="!permissions.write"
  100. )
  101. //- Just a spacer to align with folders
  102. i.fa.fa-fw.toggle(ng-if="entity.type != 'folder'")
  103. i.fa.fa-fw.fa-file(ng-if="entity.type == 'doc'")
  104. i.fa.fa-fw.fa-image(ng-if="entity.type == 'file'")
  105. span(
  106. ng-hide="entity.renaming"
  107. ) {{ entity.name }}
  108. span.rename-input
  109. input(
  110. ng-if="permissions.write",
  111. ng-show="entity.renaming",
  112. ng-model="inputs.name",
  113. ng-blur="finishRenaming()",
  114. select-name-when="entity.renaming",
  115. on-enter="finishRenaming()"
  116. )
  117. span.dropdown.entity-menu-toggle(
  118. dropdown,
  119. ng-if="permissions.write"
  120. )
  121. a.dropdown-toggle(href, dropdown-toggle, stop-propagation="click")
  122. i.fa.fa-chevron-down
  123. ul.dropdown-menu.dropdown-menu-right
  124. li
  125. a(
  126. href
  127. ng-click="startRenaming()"
  128. right-click="startRenaming()"
  129. ng-show="!entity.multiSelected"
  130. ) #{translate("rename")}
  131. li
  132. a(
  133. href
  134. ng-click="openDeleteModal()"
  135. right-click="openDeleteModal()"
  136. stop-propagation="click"
  137. ) #{translate("delete")}
  138. div.dropdown.context-menu(
  139. id="context-menu-{{ entity.id }}",
  140. ng-if="permissions.write"
  141. )
  142. ul.dropdown-menu
  143. li
  144. a(
  145. href
  146. ng-click="startRenaming()"
  147. right-click="startRenaming()"
  148. ng-show="!entity.multiSelected"
  149. ) #{translate("rename")}
  150. li
  151. a(
  152. href
  153. ng-click="openDeleteModal()"
  154. right-click="openDeleteModal()"
  155. stop-propagation="click"
  156. ) #{translate("delete")}
  157. .entity(ng-if="entity.type == 'folder'", ng-controller="FileTreeFolderController")
  158. .entity-name(
  159. ng-click="select($event)"
  160. ng-dblclick="permissions.write && startRenaming()"
  161. draggable="permissions.write"
  162. draggable-helper="draggableHelper"
  163. droppable="permissions.write"
  164. accept=".entity-name"
  165. on-drop-callback="onDrop"
  166. )
  167. div(
  168. context-menu
  169. data-target="context-menu-{{ entity.id }}"
  170. context-menu-container="body"
  171. context-menu-disabled="!permissions.write"
  172. )
  173. i.fa.fa-fw.toggle(
  174. ng-if="entity.type == 'folder'"
  175. ng-class="{'fa-chevron-right': !expanded, 'fa-chevron-down': expanded}"
  176. ng-click="toggleExpanded()"
  177. )
  178. i.fa.fa-fw(
  179. ng-if="entity.type == 'folder'"
  180. ng-class="{\
  181. 'fa-folder': !expanded, \
  182. 'fa-folder-open': expanded \
  183. }"
  184. ng-click="select($event)"
  185. )
  186. span(
  187. ng-hide="entity.renaming"
  188. ) {{ entity.name }}
  189. span.rename-input
  190. input(
  191. ng-if="permissions.write",
  192. ng-show="entity.renaming",
  193. ng-model="inputs.name",
  194. ng-blur="finishRenaming()",
  195. select-name-when="entity.renaming",
  196. on-enter="finishRenaming()"
  197. )
  198. span.dropdown.entity-menu-toggle(
  199. dropdown,
  200. ng-if="permissions.write"
  201. )
  202. a.dropdown-toggle(href, dropdown-toggle, stop-propagation="click")
  203. i.fa.fa-chevron-down
  204. ul.dropdown-menu.dropdown-menu-right
  205. li
  206. a(
  207. href
  208. ng-click="startRenaming()"
  209. right-click="startRenaming()"
  210. ng-show="!entity.multiSelected"
  211. ) #{translate("rename")}
  212. li
  213. a(
  214. href
  215. ng-click="openDeleteModal()"
  216. right-click="openDeleteModal()"
  217. stop-propagation="click"
  218. ) #{translate("delete")}
  219. li.divider
  220. li
  221. a(
  222. href
  223. ng-click="openNewDocModal()"
  224. right-click="openNewDocModal()"
  225. ) #{translate("new_file")}
  226. li
  227. a(
  228. href
  229. ng-click="openNewFolderModal()"
  230. right-click="openNewFolderModal()"
  231. ) #{translate("new_folder")}
  232. li
  233. a(
  234. href
  235. ng-click="openUploadFileModal()"
  236. right-click="openUploadFileModal()"
  237. ) #{translate("upload_file")}
  238. .dropdown.context-menu(
  239. ng-if="permissions.write"
  240. id="context-menu-{{ entity.id }}"
  241. )
  242. ul.dropdown-menu
  243. li
  244. a(
  245. href
  246. ng-click="startRenaming()"
  247. right-click="startRenaming()"
  248. ng-show="!entity.multiSelected"
  249. ) #{translate("rename")}
  250. li
  251. a(
  252. href
  253. ng-click="openDeleteModal()"
  254. right-click="openDeleteModal()"
  255. stop-propagation="click"
  256. ) #{translate("delete")}
  257. li.divider
  258. li
  259. a(
  260. href
  261. ng-click="openNewDocModal()"
  262. right-click="openNewDocModal()"
  263. ) #{translate("new_file")}
  264. li
  265. a(
  266. href
  267. ng-click="openNewFolderModal()"
  268. right-click="openNewFolderModal()"
  269. ) #{translate("new_folder")}
  270. li
  271. a(
  272. href
  273. ng-click="openUploadFileModal()"
  274. right-click="openUploadFileModal()"
  275. ) #{translate("upload_file")}
  276. ul.list-unstyled(
  277. ng-if="entity.type == 'folder'"
  278. ng-show="expanded"
  279. droppable="permissions.write"
  280. accept=".entity-name"
  281. on-drop-callback="onDrop"
  282. )
  283. file-entity(
  284. entity="child",
  285. permissions="permissions",
  286. ng-repeat="child in entity.children | orderBy:[orderByFoldersFirst, 'name']"
  287. )
  288. script(type='text/ng-template', id='newDocModalTemplate')
  289. .modal-header
  290. h3 #{translate("new_file")}
  291. .modal-body
  292. form(novalidate, name="newDocForm")
  293. input.form-control(
  294. type="text",
  295. placeholder="File Name",
  296. required,
  297. ng-model="inputs.name",
  298. on-enter="create()",
  299. select-name-on="open"
  300. )
  301. .modal-footer
  302. button.btn.btn-default(
  303. ng-disabled="state.inflight"
  304. ng-click="cancel()"
  305. ) #{translate("cancel")}
  306. button.btn.btn-primary(
  307. ng-disabled="newDocForm.$invalid || state.inflight"
  308. ng-click="create()"
  309. )
  310. span(ng-hide="state.inflight") #{translate("create")}
  311. span(ng-show="state.inflight") #{translate("creating")}...
  312. script(type='text/ng-template', id='newFolderModalTemplate')
  313. .modal-header
  314. h3 #{translate("new_folder")}
  315. .modal-body
  316. form(novalidate, name="newFolderForm")
  317. input.form-control(
  318. type="text",
  319. placeholder="Folder Name",
  320. required,
  321. ng-model="inputs.name",
  322. on-enter="create()",
  323. select-name-on="open"
  324. )
  325. .modal-footer
  326. button.btn.btn-default(
  327. ng-disabled="state.inflight"
  328. ng-click="cancel()"
  329. ) #{translate("cancel")}
  330. button.btn.btn-primary(
  331. ng-disabled="newFolderForm.$invalid || state.inflight"
  332. ng-click="create()"
  333. )
  334. span(ng-hide="state.inflight") #{translate("create")}
  335. span(ng-show="state.inflight") #{translate("creating")}...
  336. script(type="text/ng-template", id="uploadFileModalTemplate")
  337. .modal-header
  338. h3 #{translate("upload_files")}
  339. .alert.alert-warning.small.modal-alert(ng-if="tooManyFiles") #{translate("maximum_files_uploaded_together", {max:"{{max_files}}"})}
  340. .alert.alert-warning.small.modal-alert(ng-if="rateLimitHit") #{translate("too_many_files_uploaded_throttled_short_period")}
  341. .alert.alert-warning.small.modal-alert(ng-if="notLoggedIn") #{translate("session_expired_redirecting_to_login", {seconds:"{{secondsToRedirect}}"})}
  342. .modal-body(
  343. fine-upload
  344. endpoint="/project/{{ project_id }}/upload"
  345. waiting-for-response-text="{{inserting_files}}"
  346. failed-upload-text="{{upload_failed_sorry}}"
  347. upload-button-text="{{select_files}}"
  348. drag-area-text="{{drag_files}}"
  349. hint-text="{{hint_press_and_hold_control_key}}"
  350. multiple="true"
  351. on-complete-callback="onComplete"
  352. on-upload-callback="onUpload"
  353. on-validate-batch="onValidateBatch"
  354. on-error-callback="onError"
  355. params="{'folder_id': parent_folder_id}"
  356. )
  357. span #{translate("upload_files")}
  358. .modal-footer
  359. button.btn.btn-default(ng-click="cancel()") #{translate("cancel")}
  360. script(type='text/ng-template', id='deleteEntityModalTemplate')
  361. .modal-header
  362. h3 #{translate("delete")} {{ entity.name }}
  363. .modal-body
  364. p !{translate("sure_you_want_to_delete")}
  365. ul
  366. li(ng-repeat="entity in entities") {{entity.name}}
  367. .modal-footer
  368. button.btn.btn-default(
  369. ng-disabled="state.inflight"
  370. ng-click="cancel()"
  371. ) #{translate("cancel")}
  372. button.btn.btn-danger(
  373. ng-disabled="state.inflight"
  374. ng-click="delete()"
  375. )
  376. span(ng-hide="state.inflight") #{translate("delete")}
  377. span(ng-show="state.inflight") #{translate("deleting")}...