ide.coffee 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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.shouldABTestPlans = false
  88. if $scope.user.signUpDate >= '2018-06-06'
  89. $scope.shouldABTestPlans = true
  90. $scope.settings = window.userSettings
  91. $scope.anonymous = window.anonymous
  92. $scope.isTokenMember = window.isTokenMember
  93. $scope.chat = {}
  94. ide.toggleReviewPanel = $scope.toggleReviewPanel = () ->
  95. if !$scope.project.features.trackChangesVisible
  96. return
  97. $scope.ui.reviewPanelOpen = !$scope.ui.reviewPanelOpen
  98. event_tracking.sendMB "rp-toggle-panel", { value : $scope.ui.reviewPanelOpen }
  99. $scope.$watch "ui.reviewPanelOpen", (value) ->
  100. if value?
  101. localStorage "ui.reviewPanelOpen.#{window.project_id}", value
  102. $scope.$on "layout:pdf:resize", (_, layoutState) ->
  103. $scope.ui.pdfHidden = layoutState.east.initClosed
  104. $scope.ui.pdfWidth = layoutState.east.size
  105. # Tracking code.
  106. $scope.$watch "ui.view", (newView, oldView) ->
  107. if newView? and newView != "editor" and newView != "pdf"
  108. event_tracking.sendMBOnce "ide-open-view-#{ newView }-once"
  109. $scope.$watch "ui.chatOpen", (isOpen) ->
  110. event_tracking.sendMBOnce "ide-open-chat-once" if isOpen
  111. $scope.$watch "ui.leftMenuShown", (isOpen) ->
  112. event_tracking.sendMBOnce "ide-open-left-menu-once" if isOpen
  113. $scope.trackHover = (feature) ->
  114. event_tracking.sendMBOnce "ide-hover-#{feature}-once"
  115. # End of tracking code.
  116. window._ide = ide
  117. ide.validFileRegex = '^[^\*\/]*$' # Don't allow * and /
  118. ide.project_id = $scope.project_id = window.project_id
  119. ide.$scope = $scope
  120. ide.referencesSearchManager = new ReferencesManager(ide, $scope)
  121. ide.connectionManager = new ConnectionManager(ide, $scope)
  122. ide.fileTreeManager = new FileTreeManager(ide, $scope)
  123. ide.editorManager = new EditorManager(ide, $scope, localStorage)
  124. ide.onlineUsersManager = new OnlineUsersManager(ide, $scope)
  125. if window.data.useV2History
  126. ide.historyManager = new HistoryV2Manager(ide, $scope)
  127. else
  128. ide.historyManager = new HistoryManager(ide, $scope)
  129. ide.pdfManager = new PdfManager(ide, $scope)
  130. ide.permissionsManager = new PermissionsManager(ide, $scope)
  131. ide.binaryFilesManager = new BinaryFilesManager(ide, $scope)
  132. ide.metadataManager = new MetadataManager(ide, $scope, metadata)
  133. inited = false
  134. $scope.$on "project:joined", () ->
  135. return if inited
  136. inited = true
  137. if $scope?.project?.deletedByExternalDataSource
  138. ide.showGenericMessageModal("Project Renamed or Deleted", """
  139. This project has either been renamed or deleted by an external data source such as Dropbox.
  140. We don't want to delete your data on ShareLaTeX, so this project still contains your history and collaborators.
  141. If the project has been renamed please look in your project list for a new project under the new name.
  142. """)
  143. $timeout(
  144. () ->
  145. if $scope.permissions.write
  146. ide.metadataManager.loadProjectMetaFromServer()
  147. _labelsInitialLoadDone = true
  148. , 200
  149. )
  150. # Count the first 'doc:opened' as a sign that the ide is loaded
  151. # and broadcast a message. This is a good event to listen for
  152. # if you want to wait until the ide is fully loaded and initialized
  153. _loaded = false
  154. $scope.$on 'doc:opened', () ->
  155. if _loaded
  156. return
  157. $scope.$broadcast('ide:loaded')
  158. _loaded = true
  159. $scope.$on 'cursor:editor:update', event_tracking.editingSessionHeartbeat
  160. DARK_THEMES = [
  161. "ambiance", "chaos", "clouds_midnight", "cobalt", "idle_fingers",
  162. "merbivore", "merbivore_soft", "mono_industrial", "monokai",
  163. "pastel_on_dark", "solarized_dark", "terminal", "tomorrow_night",
  164. "tomorrow_night_blue", "tomorrow_night_bright", "tomorrow_night_eighties",
  165. "twilight", "vibrant_ink"
  166. ]
  167. $scope.darkTheme = false
  168. $scope.$watch "settings.editorTheme", (theme) ->
  169. if theme in DARK_THEMES
  170. $scope.darkTheme = true
  171. else
  172. $scope.darkTheme = false
  173. ide.localStorage = localStorage
  174. ide.browserIsSafari = false
  175. try
  176. userAgent = navigator.userAgent
  177. ide.browserIsSafari = (
  178. userAgent &&
  179. userAgent.match(/.*Safari\/.*/) &&
  180. !userAgent.match(/.*Chrome\/.*/) &&
  181. !userAgent.match(/.*Chromium\/.*/)
  182. )
  183. catch err
  184. console.error err
  185. if ide.browserIsSafari
  186. ide.safariScrollPatcher = new SafariScrollPatcher($scope)
  187. # Fix Chrome 61 and 62 text-shadow rendering
  188. browserIsChrome61or62 = false
  189. try
  190. chromeVersion = parseFloat(navigator.userAgent.split(" Chrome/")[1]) || null;
  191. browserIsChrome61or62 = (
  192. chromeVersion?
  193. )
  194. if browserIsChrome61or62
  195. document.styleSheets[0].insertRule(".ace_editor.ace_autocomplete .ace_completion-highlight { text-shadow: none !important; font-weight: bold; }", 1)
  196. catch err
  197. console.error err
  198. # User can append ?ft=somefeature to url to activate a feature toggle
  199. ide.featureToggle = location?.search?.match(/^\?ft=(\w+)$/)?[1]
  200. ide.socket.on 'project:publicAccessLevel:changed', (data) =>
  201. if data.newAccessLevel?
  202. ide.$scope.project.publicAccesLevel = data.newAccessLevel
  203. $scope.$digest()
  204. angular.bootstrap(document.body, ["SharelatexApp"])