ide.coffee 6.8 KB

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