file-tree.pug 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  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. 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. script(type='text/ng-template', id='entityListItemTemplate')
  85. li(
  86. ng-class="{ 'selected': entity.selected, 'multi-selected': entity.multiSelected }",
  87. ng-controller="FileTreeEntityController"
  88. )
  89. .entity(ng-if="entity.type != 'folder'")
  90. .entity-name(
  91. ng-click="select($event)"
  92. ng-dblclick="permissions.write && startRenaming()"
  93. draggable="permissions.write"
  94. draggable-helper="draggableHelper"
  95. context-menu
  96. data-target="context-menu-{{ entity.id }}"
  97. context-menu-container="body"
  98. context-menu-disabled="!permissions.write"
  99. )
  100. //- Just a spacer to align with folders
  101. i.fa.fa-fw.toggle(ng-if="entity.type != 'folder'")
  102. i.fa.fa-fw(ng-if="entity.type != 'folder'", ng-class="'fa-' + iconTypeFromName(entity.name)")
  103. span(
  104. ng-hide="entity.renaming"
  105. ) {{ entity.name }}
  106. span.rename-input
  107. input(
  108. ng-if="permissions.write",
  109. ng-show="entity.renaming",
  110. ng-model="inputs.name",
  111. ng-blur="finishRenaming()",
  112. select-name-when="entity.renaming",
  113. on-enter="finishRenaming()"
  114. )
  115. span.dropdown.entity-menu-toggle(
  116. dropdown,
  117. ng-if="permissions.write"
  118. )
  119. a.dropdown-toggle(href, dropdown-toggle, stop-propagation="click")
  120. i.fa.fa-chevron-down
  121. ul.dropdown-menu.dropdown-menu-right
  122. li
  123. a(
  124. href
  125. ng-click="startRenaming()"
  126. right-click="startRenaming()"
  127. ng-show="!entity.multiSelected"
  128. ) #{translate("rename")}
  129. li
  130. a(
  131. href
  132. ng-click="openDeleteModal()"
  133. right-click="openDeleteModal()"
  134. stop-propagation="click"
  135. ) #{translate("delete")}
  136. div.dropdown.context-menu(
  137. id="context-menu-{{ entity.id }}",
  138. ng-if="permissions.write"
  139. )
  140. ul.dropdown-menu
  141. li
  142. a(
  143. href
  144. ng-click="startRenaming()"
  145. right-click="startRenaming()"
  146. ng-show="!entity.multiSelected"
  147. ) #{translate("rename")}
  148. li
  149. a(
  150. href
  151. ng-click="openDeleteModal()"
  152. right-click="openDeleteModal()"
  153. stop-propagation="click"
  154. ) #{translate("delete")}
  155. .entity(ng-if="entity.type == 'folder'", ng-controller="FileTreeFolderController")
  156. .entity-name(
  157. ng-click="select($event)"
  158. ng-dblclick="permissions.write && startRenaming()"
  159. draggable="permissions.write"
  160. draggable-helper="draggableHelper"
  161. droppable="permissions.write"
  162. accept=".entity-name"
  163. on-drop-callback="onDrop"
  164. )
  165. div(
  166. context-menu
  167. data-target="context-menu-{{ entity.id }}"
  168. context-menu-container="body"
  169. context-menu-disabled="!permissions.write"
  170. )
  171. i.fa.fa-fw.toggle(
  172. ng-if="entity.type == 'folder'"
  173. ng-class="{'fa-chevron-right': !expanded, 'fa-chevron-down': expanded}"
  174. ng-click="toggleExpanded()"
  175. )
  176. i.fa.fa-fw(
  177. ng-if="entity.type == 'folder'"
  178. ng-class="{\
  179. 'fa-folder': !expanded, \
  180. 'fa-folder-open': expanded \
  181. }"
  182. ng-click="select($event)"
  183. )
  184. span(
  185. ng-hide="entity.renaming"
  186. ) {{ entity.name }}
  187. span.rename-input
  188. input(
  189. ng-if="permissions.write",
  190. ng-show="entity.renaming",
  191. ng-model="inputs.name",
  192. ng-blur="finishRenaming()",
  193. select-name-when="entity.renaming",
  194. on-enter="finishRenaming()"
  195. )
  196. span.dropdown.entity-menu-toggle(
  197. dropdown,
  198. ng-if="permissions.write"
  199. )
  200. a.dropdown-toggle(href, dropdown-toggle, stop-propagation="click")
  201. i.fa.fa-chevron-down
  202. ul.dropdown-menu.dropdown-menu-right
  203. li
  204. a(
  205. href
  206. ng-click="startRenaming()"
  207. right-click="startRenaming()"
  208. ng-show="!entity.multiSelected"
  209. ) #{translate("rename")}
  210. li
  211. a(
  212. href
  213. ng-click="openDeleteModal()"
  214. right-click="openDeleteModal()"
  215. stop-propagation="click"
  216. ) #{translate("delete")}
  217. li.divider
  218. li
  219. a(
  220. href
  221. ng-click="openNewDocModal()"
  222. right-click="openNewDocModal()"
  223. ) #{translate("new_file")}
  224. li
  225. a(
  226. href
  227. ng-click="openNewFolderModal()"
  228. right-click="openNewFolderModal()"
  229. ) #{translate("new_folder")}
  230. li
  231. a(
  232. href
  233. ng-click="openUploadFileModal()"
  234. right-click="openUploadFileModal()"
  235. ) #{translate("upload_file")}
  236. .dropdown.context-menu(
  237. ng-if="permissions.write"
  238. id="context-menu-{{ entity.id }}"
  239. )
  240. ul.dropdown-menu
  241. li
  242. a(
  243. href
  244. ng-click="startRenaming()"
  245. right-click="startRenaming()"
  246. ng-show="!entity.multiSelected"
  247. ) #{translate("rename")}
  248. li
  249. a(
  250. href
  251. ng-click="openDeleteModal()"
  252. right-click="openDeleteModal()"
  253. stop-propagation="click"
  254. ) #{translate("delete")}
  255. li.divider
  256. li
  257. a(
  258. href
  259. ng-click="openNewDocModal()"
  260. right-click="openNewDocModal()"
  261. ) #{translate("new_file")}
  262. li
  263. a(
  264. href
  265. ng-click="openNewFolderModal()"
  266. right-click="openNewFolderModal()"
  267. ) #{translate("new_folder")}
  268. li
  269. a(
  270. href
  271. ng-click="openUploadFileModal()"
  272. right-click="openUploadFileModal()"
  273. ) #{translate("upload_file")}
  274. ul.list-unstyled(
  275. ng-if="entity.type == 'folder'"
  276. ng-show="expanded"
  277. droppable="permissions.write"
  278. accept=".entity-name"
  279. on-drop-callback="onDrop"
  280. )
  281. file-entity(
  282. entity="child",
  283. permissions="permissions",
  284. ng-repeat="child in entity.children | orderBy:[orderByFoldersFirst, 'name']"
  285. )
  286. script(type='text/ng-template', id='newDocModalTemplate')
  287. .modal-header
  288. h3 #{translate("new_file")}
  289. .modal-body
  290. form(novalidate, name="newDocForm")
  291. div.alert.alert-danger(ng-if="error") {{error}}
  292. input.form-control(
  293. type="text",
  294. placeholder="File Name",
  295. required,
  296. ng-model="inputs.name",
  297. on-enter="create()",
  298. select-name-on="open",
  299. ng-pattern="validFileRegex",
  300. name="name"
  301. )
  302. .text-danger.row-spaced-small(ng-show="newDocForm.name.$error.pattern")
  303. | #{translate('files_cannot_include_invalid_characters')}
  304. .modal-footer
  305. button.btn.btn-default(
  306. ng-disabled="state.inflight"
  307. ng-click="cancel()"
  308. ) #{translate("cancel")}
  309. button.btn.btn-primary(
  310. ng-disabled="newDocForm.$invalid || state.inflight"
  311. ng-click="create()"
  312. )
  313. span(ng-hide="state.inflight") #{translate("create")}
  314. span(ng-show="state.inflight") #{translate("creating")}...
  315. script(type='text/ng-template', id='newFolderModalTemplate')
  316. .modal-header
  317. h3 #{translate("new_folder")}
  318. .modal-body
  319. div.alert.alert-danger(ng-if="error") {{error}}
  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. ng-pattern="validFileRegex",
  329. name="name"
  330. )
  331. .text-danger.row-spaced-small(ng-show="newFolderForm.name.$error.pattern")
  332. | #{translate('files_cannot_include_invalid_characters')}
  333. .modal-footer
  334. button.btn.btn-default(
  335. ng-disabled="state.inflight"
  336. ng-click="cancel()"
  337. ) #{translate("cancel")}
  338. button.btn.btn-primary(
  339. ng-disabled="newFolderForm.$invalid || state.inflight"
  340. ng-click="create()"
  341. )
  342. span(ng-hide="state.inflight") #{translate("create")}
  343. span(ng-show="state.inflight") #{translate("creating")}...
  344. script(type="text/ng-template", id="uploadFileModalTemplate")
  345. .modal-header
  346. h3 #{translate("upload_files")}
  347. .alert.alert-warning.small.modal-alert(ng-if="tooManyFiles") #{translate("maximum_files_uploaded_together", {max:"{{max_files}}"})}
  348. .alert.alert-warning.small.modal-alert(ng-if="rateLimitHit") #{translate("too_many_files_uploaded_throttled_short_period")}
  349. .alert.alert-warning.small.modal-alert(ng-if="notLoggedIn") #{translate("session_expired_redirecting_to_login", {seconds:"{{secondsToRedirect}}"})}
  350. .alert.alert-warning.small.modal-alert(ng-if="conflicts.length > 0")
  351. p.text-center
  352. | The following files already exist in this project:
  353. ul.text-center.list-unstyled.row-spaced-small
  354. li(ng-repeat="conflict in conflicts"): strong {{ conflict }}
  355. p.text-center.row-spaced-small
  356. | Do you want to overwrite them?
  357. p.text-center
  358. a(href, ng-click="doUpload()").btn.btn-primary Overwrite
  359. | &nbsp;
  360. a(href, ng-click="cancel()").btn.btn-default Cancel
  361. .modal-body(
  362. fine-upload
  363. endpoint="/project/{{ project_id }}/upload"
  364. waiting-for-response-text="{{inserting_files}}"
  365. failed-upload-text="{{upload_failed_sorry}}"
  366. upload-button-text="{{select_files}}"
  367. drag-area-text="{{drag_files}}"
  368. hint-text="{{hint_press_and_hold_control_key}}"
  369. multiple="true"
  370. auto-upload="false"
  371. on-complete-callback="onComplete"
  372. on-upload-callback="onUpload"
  373. on-validate-batch="onValidateBatch"
  374. on-error-callback="onError"
  375. on-submit-callback="onSubmit"
  376. on-cancel-callback="onCancel"
  377. control="control"
  378. params="{'folder_id': parent_folder_id}"
  379. )
  380. span #{translate("upload_files")}
  381. .modal-footer
  382. button.btn.btn-default(ng-click="cancel()") #{translate("cancel")}
  383. script(type='text/ng-template', id='deleteEntityModalTemplate')
  384. .modal-header
  385. h3 #{translate("delete")} {{ entity.name }}
  386. .modal-body
  387. p !{translate("sure_you_want_to_delete")}
  388. ul
  389. li(ng-repeat="entity in entities") {{entity.name}}
  390. .modal-footer
  391. button.btn.btn-default(
  392. ng-disabled="state.inflight"
  393. ng-click="cancel()"
  394. ) #{translate("cancel")}
  395. button.btn.btn-danger(
  396. ng-disabled="state.inflight"
  397. ng-click="delete()"
  398. )
  399. span(ng-hide="state.inflight") #{translate("delete")}
  400. span(ng-show="state.inflight") #{translate("deleting")}...
  401. script(type='text/ng-template', id='invalidFileNameModalTemplate')
  402. .modal-header
  403. h3 #{translate('invalid_file_name')}
  404. .modal-body
  405. p #{translate('files_cannot_include_invalid_characters')}
  406. .modal-footer
  407. button.btn.btn-default(
  408. ng-click="$close()"
  409. ) #{translate('ok')}