ide.coffee 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. define [
  2. "ide/ConnectionManager"
  3. "history/HistoryManager"
  4. "auto-complete/AutoCompleteManager"
  5. "project-members/ProjectMembersManager"
  6. "settings/SettingsManager"
  7. "editor/Editor"
  8. "pdf/PdfManager"
  9. "ide/MainAreaManager"
  10. "ide/SideBarManager"
  11. "ide/TabManager"
  12. "ide/LayoutManager"
  13. "ide/FileUploadManager"
  14. "ide/SavingAreaManager"
  15. "spelling/SpellingManager"
  16. "search/SearchManager"
  17. "models/Project"
  18. "models/User"
  19. "utils/Modal"
  20. "file-tree/FileTreeManager"
  21. "messages/MessageManager"
  22. "help/HelpManager"
  23. "cursors/CursorManager"
  24. "keys/HotkeysManager"
  25. "keys/BackspaceHighjack"
  26. "file-view/FileViewManager"
  27. "tour/IdeTour"
  28. "analytics/AnalyticsManager"
  29. "track-changes/TrackChangesManager"
  30. "debug/DebugManager"
  31. "ace/ace"
  32. "libs/jquery.color"
  33. "libs/jquery-layout"
  34. "libs/backbone"
  35. "main"
  36. ], (
  37. ConnectionManager,
  38. HistoryManager,
  39. AutoCompleteManager,
  40. ProjectMembers,
  41. SettingsManager,
  42. Editor,
  43. PdfManager,
  44. MainAreaManager,
  45. SideBarManager,
  46. TabManager,
  47. LayoutManager,
  48. FileUploadManager,
  49. SavingAreaManager,
  50. SpellingManager,
  51. SearchManager,
  52. Project,
  53. User,
  54. Modal,
  55. FileTreeManager,
  56. MessageManager,
  57. HelpManager,
  58. CursorManager,
  59. HotkeysManager,
  60. BackspaceHighjack,
  61. FileViewManager,
  62. IdeTour,
  63. AnalyticsManager,
  64. TrackChangesManager
  65. DebugManager
  66. ) ->
  67. ProjectMembersManager = ProjectMembers.ProjectMembersManager
  68. mainAreaManager = undefined
  69. socket = undefined
  70. currentDoc_id = undefined
  71. selectElement = undefined
  72. security = undefined
  73. _.templateSettings =
  74. interpolate : /\{\{(.+?)\}\}/g
  75. isAllowedToDoIt = (permissionsLevel)->
  76. if permissionsLevel == "owner" && _.include ["owner"], security.permissionsLevel
  77. return true
  78. else if permissionsLevel == "readAndWrite" && _.include ["readAndWrite", "owner"], security.permissionsLevel
  79. return true
  80. else if permissionsLevel == "readOnly" && _.include ["readOnly", "readAndWrite", "owner"], security.permissionsLevel
  81. return true
  82. else
  83. return false
  84. Ide = class Ide
  85. constructor: () ->
  86. @userSettings = window.userSettings
  87. @project_id = @userSettings.project_id
  88. @user = User.findOrBuild window.user.id, window.user
  89. ide = this
  90. @isAllowedToDoIt = isAllowedToDoIt
  91. ioOptions =
  92. reconnect: false
  93. "force new connection": true
  94. @socket = socket = io.connect null, ioOptions
  95. @messageManager = new MessageManager(@)
  96. @connectionManager = new ConnectionManager(@)
  97. @tabManager = new TabManager(@)
  98. @layoutManager = new LayoutManager(@)
  99. @sideBarView = new SideBarManager(@, $("#sections"))
  100. selectElement = @sideBarView.selectElement
  101. mainAreaManager = @mainAreaManager = new MainAreaManager(@, $("#content"))
  102. @fileTreeManager = new FileTreeManager(@)
  103. @editor = new Editor(@)
  104. @pdfManager = new PdfManager(@)
  105. if @userSettings.autoComplete
  106. @autoCompleteManager = new AutoCompleteManager(@)
  107. @spellingManager = new SpellingManager(@)
  108. @fileUploadManager = new FileUploadManager(@)
  109. @searchManager = new SearchManager(@)
  110. @cursorManager = new CursorManager(@)
  111. @fileViewManager = new FileViewManager(@)
  112. @analyticsManager = new AnalyticsManager(@)
  113. if @userSettings.oldHistory
  114. @historyManager = new HistoryManager(@)
  115. else
  116. @trackChangesManager = new TrackChangesManager(@)
  117. @setLoadingMessage("Connecting")
  118. firstConnect = true
  119. socket.on "connect", () =>
  120. @setLoadingMessage("Joining project")
  121. joinProject = () =>
  122. socket.emit 'joinProject', {project_id: @project_id}, (err, project, permissionsLevel, protocolVersion) =>
  123. @hideLoadingScreen()
  124. if @protocolVersion? and @protocolVersion != protocolVersion
  125. location.reload(true)
  126. @protocolVersion = protocolVersion
  127. Security = {}
  128. Security.permissionsLevel = permissionsLevel
  129. @security = security = Object.freeze(Security)
  130. @project = new Project project, parse: true
  131. @project.set("ide", ide)
  132. ide.trigger "afterJoinProject", @project
  133. if firstConnect
  134. @pdfManager.refreshPdf(isAutoCompile:true)
  135. firstConnect = false
  136. setTimeout(joinProject, 100)
  137. showErrorModal: (title, message)->
  138. new Modal {
  139. title: title
  140. message: message
  141. buttons: [ text: "OK" ]
  142. }
  143. showGenericServerErrorMessage: ()->
  144. new Modal {
  145. title: "There was a problem talking to the server"
  146. message: "Sorry, we couldn't complete your request right now. Please wait a few moments and try again. If the problem persists, please let us know."
  147. buttons: [ text: "OK" ]
  148. }
  149. recentEvents: []
  150. pushEvent: (type, meta = {}) ->
  151. @recentEvents.push type: type, meta: meta, date: new Date()
  152. if @recentEvents.length > 40
  153. @recentEvents.shift()
  154. reportError: (error, meta = {}) ->
  155. meta.client_id = @socket?.socket?.sessionid
  156. meta.transport = @socket?.socket?.transport?.name
  157. meta.client_now = new Date()
  158. meta.recent_events = @recentEvents
  159. errorObj = {}
  160. if typeof error == "object"
  161. for key in Object.getOwnPropertyNames(error)
  162. errorObj[key] = error[key]
  163. else if typeof error == "string"
  164. errorObj.message = error
  165. $.ajax
  166. url: "/error/client"
  167. type: "POST"
  168. data: JSON.stringify
  169. error: errorObj
  170. meta: meta
  171. contentType: "application/json; charset=utf-8"
  172. headers:
  173. "X-Csrf-Token": window.csrfToken
  174. setLoadingMessage: (message) ->
  175. $("#loadingMessage").text(message)
  176. hideLoadingScreen: () ->
  177. $("#loadingScreen").remove()
  178. _.extend(Ide::, Backbone.Events)
  179. window.ide = ide = new Ide()
  180. ide.projectMembersManager = new ProjectMembersManager ide
  181. ide.settingsManager = new SettingsManager ide
  182. ide.helpManager = new HelpManager ide
  183. ide.hotkeysManager = new HotkeysManager ide
  184. ide.layoutManager.resizeAllSplitters()
  185. ide.tourManager = new IdeTour ide
  186. ide.debugManager = new DebugManager(ide)
  187. ide.savingAreaManager = new SavingAreaManager(ide)