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/AutoCompileOnboardingController",
  17. "ide/LinkSharingOnboardingController",
  18. "ide/settings/index"
  19. "ide/share/index"
  20. "ide/chat/index"
  21. "ide/clone/index"
  22. "ide/hotkeys/index"
  23. "ide/wordcount/index"
  24. "ide/directives/layout"
  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. "filters/formatDate"
  39. "main/event"
  40. "main/account-upgrade"
  41. ], (
  42. App
  43. FileTreeManager
  44. ConnectionManager
  45. EditorManager
  46. OnlineUsersManager
  47. HistoryManager
  48. HistoryV2Manager
  49. PermissionsManager
  50. PdfManager
  51. BinaryFilesManager
  52. ReferencesManager
  53. MetadataManager
  54. ReviewPanelManager
  55. SafariScrollPatcher
  56. ) ->
  57. App.controller "IdeController", ($scope, $timeout, ide, localStorage, sixpack, event_tracking, metadata) ->
  58. # Don't freak out if we're already in an apply callback
  59. $scope.$originalApply = $scope.$apply
  60. $scope.$apply = (fn = () ->) ->
  61. phase = @$root.$$phase
  62. if (phase == '$apply' || phase == '$digest')
  63. fn()
  64. else
  65. this.$originalApply(fn);
  66. $scope.state = {
  67. loading: true
  68. load_progress: 40
  69. error: null
  70. }
  71. $scope.ui = {
  72. leftMenuShown: false
  73. view: "editor"
  74. chatOpen: false
  75. pdfLayout: 'sideBySide'
  76. pdfHidden: false
  77. pdfWidth: 0
  78. reviewPanelOpen: localStorage("ui.reviewPanelOpen.#{window.project_id}")
  79. miniReviewPanelVisible: false
  80. chatResizerSizeOpen: window.uiConfig.chatResizerSizeOpen
  81. chatResizerSizeClosed: window.uiConfig.chatResizerSizeClosed
  82. }
  83. $scope.onboarding = {
  84. autoCompile: if window.showAutoCompileOnboarding then 'unseen' else 'dismissed'
  85. linkSharing: if window.showLinkSharingOnboarding then 'unseen' else 'dismissed'
  86. }
  87. $scope.user = window.user
  88. $scope.shouldABTestPlans = false
  89. if $scope.user.signUpDate >= '2016-10-27'
  90. $scope.shouldABTestPlans = true
  91. $scope.settings = window.userSettings
  92. $scope.anonymous = window.anonymous
  93. $scope.isTokenMember = window.isTokenMember
  94. $scope.chat = {}
  95. ide.toggleReviewPanel = $scope.toggleReviewPanel = () ->
  96. if !$scope.project.features.trackChangesVisible
  97. return
  98. $scope.ui.reviewPanelOpen = !$scope.ui.reviewPanelOpen
  99. event_tracking.sendMB "rp-toggle-panel", { value : $scope.ui.reviewPanelOpen }
  100. $scope.$watch "ui.reviewPanelOpen", (value) ->
  101. if value?
  102. localStorage "ui.reviewPanelOpen.#{window.project_id}", value
  103. $scope.$on "layout:pdf:resize", (_, layoutState) ->
  104. $scope.ui.pdfHidden = layoutState.east.initClosed
  105. $scope.ui.pdfWidth = layoutState.east.size
  106. # Tracking code.
  107. $scope.$watch "ui.view", (newView, oldView) ->
  108. if newView? and newView != "editor" and newView != "pdf"
  109. event_tracking.sendMBOnce "ide-open-view-#{ newView }-once"
  110. $scope.$watch "ui.chatOpen", (isOpen) ->
  111. event_tracking.sendMBOnce "ide-open-chat-once" if isOpen
  112. $scope.$watch "ui.leftMenuShown", (isOpen) ->
  113. event_tracking.sendMBOnce "ide-open-left-menu-once" if isOpen
  114. $scope.trackHover = (feature) ->
  115. event_tracking.sendMBOnce "ide-hover-#{feature}-once"
  116. # End of tracking code.
  117. window._ide = ide
  118. ide.validFileRegex = '^[^\*\/]*$' # Don't allow * and /
  119. ide.project_id = $scope.project_id = window.project_id
  120. ide.$scope = $scope
  121. ide.referencesSearchManager = new ReferencesManager(ide, $scope)
  122. ide.connectionManager = new ConnectionManager(ide, $scope)
  123. ide.fileTreeManager = new FileTreeManager(ide, $scope)
  124. ide.editorManager = new EditorManager(ide, $scope)
  125. ide.onlineUsersManager = new OnlineUsersManager(ide, $scope)
  126. if window.data.useV2History
  127. ide.historyManager = new HistoryV2Manager(ide, $scope)
  128. else
  129. ide.historyManager = new HistoryManager(ide, $scope)
  130. ide.pdfManager = new PdfManager(ide, $scope)
  131. ide.permissionsManager = new PermissionsManager(ide, $scope)
  132. ide.binaryFilesManager = new BinaryFilesManager(ide, $scope)
  133. ide.metadataManager = new MetadataManager(ide, $scope, metadata)
  134. inited = false
  135. $scope.$on "project:joined", () ->
  136. return if inited
  137. inited = true
  138. if $scope?.project?.deletedByExternalDataSource
  139. ide.showGenericMessageModal("Project Renamed or Deleted", """
  140. This project has either been renamed or deleted by an external data source such as Dropbox.
  141. We don't want to delete your data on ShareLaTeX, so this project still contains your history and collaborators.
  142. If the project has been renamed please look in your project list for a new project under the new name.
  143. """)
  144. $timeout(
  145. () ->
  146. if $scope.permissions.write
  147. ide.metadataManager.loadProjectMetaFromServer()
  148. _labelsInitialLoadDone = true
  149. , 200
  150. )
  151. # Count the first 'doc:opened' as a sign that the ide is loaded
  152. # and broadcast a message. This is a good event to listen for
  153. # if you want to wait until the ide is fully loaded and initialized
  154. _loaded = false
  155. $scope.$on 'doc:opened', () ->
  156. if _loaded
  157. return
  158. $scope.$broadcast('ide:loaded')
  159. _loaded = true
  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.theme", (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. (chromeVersion == 61 || chromeVersion == 62)
  194. )
  195. if browserIsChrome61or62
  196. document.styleSheets[0].insertRule(".ace_editor.ace_autocomplete .ace_completion-highlight { text-shadow: none !important; }", 1)
  197. catch err
  198. console.error err
  199. # User can append ?ft=somefeature to url to activate a feature toggle
  200. ide.featureToggle = location?.search?.match(/^\?ft=(\w+)$/)?[1]
  201. ide.socket.on 'project:publicAccessLevel:changed', (data) =>
  202. if data.newAccessLevel?
  203. ide.$scope.project.publicAccesLevel = data.newAccessLevel
  204. $scope.$digest()
  205. angular.bootstrap(document.body, ["SharelatexApp"])