FolderView.coffee 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. define [
  2. "models/Folder"
  3. "models/Doc"
  4. "models/File"
  5. "file-tree/EntityView"
  6. "file-tree/DocView"
  7. "file-tree/FileView"
  8. "utils/Modal"
  9. "utils/Effects"
  10. "libs/mustache"
  11. ], (Folder, Doc, File, EntityView, DocView, FileView, Modal, Effects) ->
  12. FolderView = EntityView.extend
  13. templates:
  14. childList: $("#entityListTemplate").html()
  15. entityTemplate: $("#folderTemplate").html()
  16. events: () ->
  17. events = EntityView::events.apply(this)
  18. events["click ##{@model.id} > .js-toggle"] = "onToggle"
  19. return events
  20. render: () ->
  21. EntityView::render.apply(this, arguments)
  22. @renderEntries()
  23. return @
  24. renderEntries: () ->
  25. @$el.append(Mustache.to_html @templates.childList, @model.attributes)
  26. @$contents = @$(".contents")
  27. @$childList = @$(".entity-list")
  28. @$menu = @$(".js-new-entity-menu")
  29. @$deleteButton = @$(".js-delete-btn")
  30. @$toggle = @$entityListItemEl.children(".js-toggle")
  31. @_renderChildViews()
  32. @_initializeDrop()
  33. @hideEntries()
  34. _renderChildViews: () ->
  35. throw "Already rendered children" unless !@views?
  36. @views = []
  37. @model.get("children").each (child) =>
  38. view = @_buildViewForModel(child)
  39. @views.push view
  40. @$childList.append(view.$el)
  41. view.render()
  42. @bindToCollection()
  43. renderNewEntry: (model, index) ->
  44. view = @_buildViewForModel(model)
  45. @views.splice(index, 0, view)
  46. if index == 0
  47. @$childList.prepend(view.$el)
  48. else
  49. view.$el.insertAfter(@views[index-1].$el)
  50. view.render()
  51. Effects.fadeElementIn view.$el
  52. removeEntry: (model, index) ->
  53. view = @views[index]
  54. @views.splice(index,1)
  55. if model.get("deleted")
  56. Effects.fadeElementOut view.$el, () ->
  57. view.remove()
  58. else
  59. view.remove()
  60. _buildViewForModel: (model) ->
  61. attrs = model: model, manager: @options.manager
  62. if model instanceof Folder
  63. view = new FolderView(attrs)
  64. else if model instanceof Doc
  65. view = new DocView(attrs)
  66. else
  67. view = new FileView(attrs)
  68. return view
  69. _initializeDrop: () ->
  70. onDrop = (event, ui) =>
  71. if event.target == @$childList[0] or event.target == @$entityListItemEl[0]
  72. entity = ui.draggable
  73. entity_id = entity.attr("id")
  74. entity_type = entity.attr("entity-type")
  75. @manager.moveEntity entity_id, @model.id, entity_type
  76. @$entityListItemEl.droppable
  77. greedy: true
  78. hoverClass: "droppable-folder-hover"
  79. drop: onDrop
  80. @$childList.droppable
  81. greedy: true
  82. hoverClass: "droppable-folder-hover"
  83. drop: onDrop
  84. bindToCollection: () ->
  85. @model.get("children").on "add", (model, folderCollection, data) =>
  86. @renderNewEntry(model, data.index)
  87. @model.get("children").on "remove", (model, folderCollection, data) =>
  88. @removeEntry(model, data.index)
  89. onClick: (e) ->
  90. e.preventDefault()
  91. @options.manager.openFolder(@model)
  92. hideEntries: () ->
  93. @$contents.hide()
  94. @$toggle.find(".js-open").hide()
  95. @$toggle.find(".js-closed").show()
  96. @$entityListItemEl.removeClass("folder-open")
  97. showEntries: () ->
  98. @$contents.show()
  99. @$toggle.find(".js-open").show()
  100. @$toggle.find(".js-closed").hide()
  101. @$entityListItemEl.addClass("folder-open")
  102. onToggle: (e) ->
  103. e.preventDefault()
  104. if @$contents.is(":visible")
  105. @hideEntries()
  106. else
  107. @showEntries()
  108. getContextMenuEntries: (args...) ->
  109. return null if @readonly
  110. entries = EntityView::getContextMenuEntries.apply(this, args)
  111. entries.push {
  112. divider: true
  113. }
  114. entries.push @getFolderContextMenuEntries()...
  115. return entries
  116. getFolderContextMenuEntries: () ->
  117. return [{
  118. text: "New file"
  119. onClick: () =>
  120. ga('send', 'event', 'editor-interaction', 'newFile', "folderView")
  121. @manager.showNewDocModal(@model)
  122. }, {
  123. text: "New folder"
  124. onClick: () =>
  125. ga('send', 'event', 'editor-interaction', 'newFolder', "folderView")
  126. @manager.showNewFolderModal(@model)
  127. }, {
  128. text: "Upload file"
  129. onClick: () =>
  130. ga('send', 'event', 'editor-interaction', 'uploadFile', "folderView")
  131. @manager.showUploadFileModal(@model)
  132. }]
  133. setLabels: (labels) ->
  134. showLabel = false
  135. for entity in @views
  136. if entity.setLabels(labels)
  137. showLabel = true
  138. if showLabel
  139. @$entityListItemEl.addClass("show-label")
  140. @$labelEl.text("±")
  141. return true
  142. else
  143. @$entityListItemEl.removeClass("show-label")
  144. @$labelEl.text("")
  145. return false