ide.coffee 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. define [
  2. "base"
  3. "ide/file-tree/FileTreeManager"
  4. "ide/connection/ConnectionManager"
  5. "ide/editor/EditorManager"
  6. "ide/online-users/OnlineUsersManager"
  7. "ide/history/HistoryManager"
  8. "ide/history/HistoryV2Manager"
  9. "ide/permissions/PermissionsManager"
  10. "ide/pdf/PdfManager"
  11. "ide/binary-files/BinaryFilesManager"
  12. "ide/references/ReferencesManager"
  13. "ide/metadata/MetadataManager"
  14. "ide/review-panel/ReviewPanelManager"
  15. "ide/SafariScrollPatcher"
  16. "ide/settings/index"
  17. "ide/share/index"
  18. "ide/chat/index"
  19. "ide/clone/index"
  20. "ide/hotkeys/index"
  21. "ide/test-controls/index"
  22. "ide/wordcount/index"
  23. "ide/directives/layout"
  24. "ide/directives/validFile"
  25. "ide/services/ide"
  26. "__IDE_CLIENTSIDE_INCLUDES__"
  27. "analytics/AbTestingManager"
  28. "directives/focus"
  29. "directives/fineUpload"
  30. "directives/scroll"
  31. "directives/onEnter"
  32. "directives/stopPropagation"
  33. "directives/rightClick"
  34. "directives/expandableTextArea"
  35. "directives/videoPlayState"
  36. "services/queued-http"
  37. "services/validateCaptcha"
  38. "services/wait-for"
  39. "filters/formatDate"
  40. "main/event"
  41. "main/account-upgrade"
  42. ], (
  43. App
  44. FileTreeManager
  45. ConnectionManager
  46. EditorManager
  47. OnlineUsersManager
  48. HistoryManager
  49. HistoryV2Manager
  50. PermissionsManager
  51. PdfManager
  52. BinaryFilesManager
  53. ReferencesManager
  54. MetadataManager
  55. ReviewPanelManager
  56. SafariScrollPatcher
  57. ) ->
  58. App.controller "IdeController", ($scope, $timeout, ide, localStorage, sixpack, event_tracking, metadata, $q) ->
  59. # Don't freak out if we're already in an apply callback
  60. $scope.$originalApply = $scope.$apply
  61. $scope.$apply = (fn = () ->) ->
  62. phase = @$root.$$phase
  63. if (phase == '$apply' || phase == '$digest')
  64. fn()
  65. else
  66. this.$originalApply(fn);
  67. $scope.state = {
  68. loading: true
  69. load_progress: 40
  70. error: null
  71. }
  72. $scope.ui = {
  73. leftMenuShown: false
  74. view: "editor"
  75. chatOpen: false
  76. pdfLayout: 'sideBySide'
  77. pdfHidden: false
  78. pdfWidth: 0
  79. reviewPanelOpen: localStorage("ui.reviewPanelOpen.#{window.project_id}")
  80. miniReviewPanelVisible: false
  81. chatResizerSizeOpen: window.uiConfig.chatResizerSizeOpen
  82. chatResizerSizeClosed: window.uiConfig.chatResizerSizeClosed
  83. defaultFontFamily: window.uiConfig.defaultFontFamily
  84. defaultLineHeight: window.uiConfig.defaultLineHeight
  85. }
  86. $scope.user = window.user
  87. $scope.settings = window.userSettings
  88. $scope.anonymous = window.anonymous
  89. $scope.isTokenMember = window.isTokenMember
  90. $scope.chat = {}
  91. ide.toggleReviewPanel = $scope.toggleReviewPanel = () ->
  92. if !$scope.project.features.trackChangesVisible
  93. return
  94. $scope.ui.reviewPanelOpen = !$scope.ui.reviewPanelOpen
  95. event_tracking.sendMB "rp-toggle-panel", { value : $scope.ui.reviewPanelOpen }
  96. $scope.$watch "ui.reviewPanelOpen", (value) ->
  97. if value?
  98. localStorage "ui.reviewPanelOpen.#{window.project_id}", value
  99. $scope.$on "layout:pdf:resize", (_, layoutState) ->
  100. $scope.ui.pdfHidden = layoutState.east.initClosed
  101. $scope.ui.pdfWidth = layoutState.east.size
  102. # Tracking code.
  103. $scope.$watch "ui.view", (newView, oldView) ->
  104. if newView? and newView != "editor" and newView != "pdf"
  105. event_tracking.sendMBOnce "ide-open-view-#{ newView }-once"
  106. $scope.$watch "ui.chatOpen", (isOpen) ->
  107. event_tracking.sendMBOnce "ide-open-chat-once" if isOpen
  108. $scope.$watch "ui.leftMenuShown", (isOpen) ->
  109. event_tracking.sendMBOnce "ide-open-left-menu-once" if isOpen
  110. $scope.trackHover = (feature) ->
  111. event_tracking.sendMBOnce "ide-hover-#{feature}-once"
  112. # End of tracking code.
  113. window._ide = ide
  114. ide.validFileRegex = '^[^\*\/]*$' # Don't allow * and /
  115. ide.project_id = $scope.project_id = window.project_id
  116. ide.$scope = $scope
  117. ide.referencesSearchManager = new ReferencesManager(ide, $scope)
  118. ide.connectionManager = new ConnectionManager(ide, $scope)
  119. ide.fileTreeManager = new FileTreeManager(ide, $scope)
  120. ide.editorManager = new EditorManager(ide, $scope, localStorage)
  121. ide.onlineUsersManager = new OnlineUsersManager(ide, $scope)
  122. if window.data.useV2History
  123. ide.historyManager = new HistoryV2Manager(ide, $scope)
  124. else
  125. ide.historyManager = new HistoryManager(ide, $scope)
  126. ide.pdfManager = new PdfManager(ide, $scope)
  127. ide.permissionsManager = new PermissionsManager(ide, $scope)
  128. ide.binaryFilesManager = new BinaryFilesManager(ide, $scope)
  129. ide.metadataManager = new MetadataManager(ide, $scope, metadata)
  130. inited = false
  131. $scope.$on "project:joined", () ->
  132. return if inited
  133. inited = true
  134. if $scope?.project?.deletedByExternalDataSource
  135. ide.showGenericMessageModal("Project Renamed or Deleted", """
  136. This project has either been renamed or deleted by an external data source such as Dropbox.
  137. We don't want to delete your data on ShareLaTeX, so this project still contains your history and collaborators.
  138. If the project has been renamed please look in your project list for a new project under the new name.
  139. """)
  140. $timeout(
  141. () ->
  142. if $scope.permissions.write
  143. ide.metadataManager.loadProjectMetaFromServer()
  144. _labelsInitialLoadDone = true
  145. , 200
  146. )
  147. # Count the first 'doc:opened' as a sign that the ide is loaded
  148. # and broadcast a message. This is a good event to listen for
  149. # if you want to wait until the ide is fully loaded and initialized
  150. _loaded = false
  151. $scope.$on 'doc:opened', () ->
  152. if _loaded
  153. return
  154. $scope.$broadcast('ide:loaded')
  155. _loaded = true
  156. $scope.$on 'cursor:editor:update', event_tracking.editingSessionHeartbeat
  157. DARK_THEMES = [
  158. "ambiance", "chaos", "clouds_midnight", "cobalt", "idle_fingers",
  159. "merbivore", "merbivore_soft", "mono_industrial", "monokai",
  160. "pastel_on_dark", "solarized_dark", "terminal", "tomorrow_night",
  161. "tomorrow_night_blue", "tomorrow_night_bright", "tomorrow_night_eighties",
  162. "twilight", "vibrant_ink"
  163. ]
  164. $scope.darkTheme = false
  165. $scope.$watch "settings.editorTheme", (theme) ->
  166. if theme in DARK_THEMES
  167. $scope.darkTheme = true
  168. else
  169. $scope.darkTheme = false
  170. ide.localStorage = localStorage
  171. ide.browserIsSafari = false
  172. try
  173. userAgent = navigator.userAgent
  174. ide.browserIsSafari = (
  175. userAgent &&
  176. /.*Safari\/.*/.test(userAgent) &&
  177. !/.*Chrome\/.*/.test(userAgent) &&
  178. !/.*Chromium\/.*/.test(userAgent)
  179. )
  180. catch err
  181. console.error err
  182. if ide.browserIsSafari
  183. ide.safariScrollPatcher = new SafariScrollPatcher($scope)
  184. # Fix Chrome 61 and 62 text-shadow rendering
  185. browserIsChrome61or62 = false
  186. try
  187. chromeVersion = parseFloat(navigator.userAgent.split(" Chrome/")[1]) || null;
  188. browserIsChrome61or62 = (
  189. chromeVersion?
  190. )
  191. if browserIsChrome61or62
  192. document.styleSheets[0].insertRule(".ace_editor.ace_autocomplete .ace_completion-highlight { text-shadow: none !important; font-weight: bold; }", 1)
  193. catch err
  194. console.error err
  195. # User can append ?ft=somefeature to url to activate a feature toggle
  196. ide.featureToggle = location?.search?.match(/^\?ft=(\w+)$/)?[1]
  197. ide.socket.on 'project:publicAccessLevel:changed', (data) =>
  198. if data.newAccessLevel?
  199. ide.$scope.project.publicAccesLevel = data.newAccessLevel
  200. $scope.$digest()
  201. angular.bootstrap(document.body, ["SharelatexApp"])