FileTreeManager.coffee 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. define [
  2. "ide/file-tree/directives/fileEntity"
  3. "ide/file-tree/controllers/FileTreeController"
  4. "ide/file-tree/controllers/FileTreeFolderController"
  5. "ide/file-tree/controllers/FileTreeEntityController"
  6. ], () ->
  7. class FileTreeManager
  8. constructor: (@ide, @$scope) ->
  9. @$scope.$on "project:joined", =>
  10. @loadRootFolder()
  11. @_bindToSocketEvents()
  12. _bindToSocketEvents: () ->
  13. @ide.socket.on "docCreated", (parent_folder_id, doc) =>
  14. console.log "Doc created", parent_folder_id, doc
  15. parent_folder = @findEntityById(parent_folder_id) or @$scope.rootFolder
  16. @$scope.$apply () ->
  17. parent_folder.children.push {
  18. name: doc.name
  19. id: doc._id
  20. type: "doc"
  21. }
  22. findEntityById: (id) ->
  23. @_findEntityByIdInFolder @$scope.rootFolder, id
  24. _findEntityByIdInFolder: (folder, id) ->
  25. for entity in folder.children or []
  26. if entity.id == id
  27. return entity
  28. else if entity.children?
  29. result = @_findEntityByIdInFolder(entity, id)
  30. return result if result?
  31. return null
  32. forEachEntity: (callback) ->
  33. @_forEachEntityInFolder(@$scope.rootFolder, callback)
  34. _forEachEntityInFolder: (folder, callback) ->
  35. for entity in folder.children or []
  36. callback(entity)
  37. if entity.children?
  38. @_forEachEntityInFolder(entity, callback)
  39. # forEachFolder: (callback) ->
  40. # @forEachEntity (entity) ->
  41. # if entity.type == "folder"
  42. # callback(entity)
  43. loadRootFolder: () ->
  44. @$scope.rootFolder = @_parseFolder(@$scope.project.rootFolder[0])
  45. _parseFolder: (rawFolder) ->
  46. folder = {
  47. name: rawFolder.name
  48. id: rawFolder._id
  49. type: "folder"
  50. children: []
  51. }
  52. for doc in rawFolder.docs or []
  53. folder.children.push {
  54. name: doc.name
  55. id: doc._id
  56. type: "doc"
  57. }
  58. for file in rawFolder.fileRefs or []
  59. folder.children.push {
  60. name: file.name
  61. id: file._id
  62. type: "file"
  63. }
  64. for childFolder in rawFolder.folders or []
  65. folder.children.push @_parseFolder(childFolder)
  66. return folder
  67. getCurrentFolder: (startFolder = @$scope.rootFolder) ->
  68. for entity in startFolder.children or []
  69. # The 'current' folder is either the one selected, or
  70. # the one containing the selected doc/file
  71. if entity.selected
  72. if entity.type == "folder"
  73. return entity
  74. else
  75. return startFolder
  76. if entity.type == "folder"
  77. result = @getCurrentFolder(entity)
  78. return result if result?
  79. return null
  80. createDocInCurrentFolder: (name, callback = (error, doc) ->) ->
  81. # We'll wait for the socket.io 'createDoc' notification to actually
  82. # add the doc for us.
  83. parent_folder = @getCurrentFolder()
  84. $.ajax {
  85. url: "/project/#{@ide.project_id}/doc"
  86. type: "POST"
  87. contentType: "application/json; charset=utf-8"
  88. data: JSON.stringify {
  89. name: name,
  90. parent_folder_id: parent_folder?.id
  91. _csrf: window.csrfToken
  92. }
  93. dataType: "json"
  94. success: (doc) ->
  95. console.log "Got doc from POST", doc
  96. callback(null, doc)
  97. failure: (error) -> callback(error)
  98. }