ide.coffee 7.1 KB

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