ide.coffee 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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/FeatureOnboardingController"
  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/services/ide"
  24. "__IDE_CLIENTSIDE_INCLUDES__"
  25. "analytics/AbTestingManager"
  26. "directives/focus"
  27. "directives/fineUpload"
  28. "directives/scroll"
  29. "directives/onEnter"
  30. "directives/stopPropagation"
  31. "directives/rightClick"
  32. "directives/expandableTextArea"
  33. "directives/videoPlayState"
  34. "services/queued-http"
  35. "filters/formatDate"
  36. "main/event"
  37. "main/account-upgrade"
  38. ], (
  39. App
  40. FileTreeManager
  41. ConnectionManager
  42. EditorManager
  43. OnlineUsersManager
  44. HistoryManager
  45. PermissionsManager
  46. PdfManager
  47. BinaryFilesManager
  48. ReferencesManager
  49. LabelsManager
  50. ReviewPanelManager
  51. SafariScrollPatcher
  52. ) ->
  53. App.controller "IdeController", ($scope, $timeout, ide, localStorage, sixpack, event_tracking, labels) ->
  54. # Don't freak out if we're already in an apply callback
  55. $scope.$originalApply = $scope.$apply
  56. $scope.$apply = (fn = () ->) ->
  57. phase = @$root.$$phase
  58. if (phase == '$apply' || phase == '$digest')
  59. fn()
  60. else
  61. this.$originalApply(fn);
  62. $scope.state = {
  63. loading: true
  64. load_progress: 40
  65. error: null
  66. }
  67. $scope.ui = {
  68. leftMenuShown: false
  69. view: "editor"
  70. chatOpen: false
  71. pdfLayout: 'sideBySide'
  72. reviewPanelOpen: localStorage("ui.reviewPanelOpen.#{window.project_id}")
  73. miniReviewPanelVisible: false
  74. }
  75. $scope.user = window.user
  76. $scope.$watch "project.features.trackChangesVisible", (visible) ->
  77. return if !visible?
  78. $scope.ui.showCollabFeaturesOnboarding = window.showTrackChangesOnboarding and visible
  79. $scope.shouldABTestPlans = false
  80. if $scope.user.signUpDate >= '2016-10-27'
  81. $scope.shouldABTestPlans = true
  82. $scope.settings = window.userSettings
  83. $scope.anonymous = window.anonymous
  84. $scope.chat = {}
  85. ide.toggleReviewPanel = $scope.toggleReviewPanel = () ->
  86. if !$scope.project.features.trackChangesVisible
  87. return
  88. $scope.ui.reviewPanelOpen = !$scope.ui.reviewPanelOpen
  89. event_tracking.sendMB "rp-toggle-panel", { value : $scope.ui.reviewPanelOpen }
  90. $scope.$watch "ui.reviewPanelOpen", (value) ->
  91. if value?
  92. localStorage "ui.reviewPanelOpen.#{window.project_id}", value
  93. # Tracking code.
  94. $scope.$watch "ui.view", (newView, oldView) ->
  95. if newView? and newView != "editor" and newView != "pdf"
  96. event_tracking.sendMBOnce "ide-open-view-#{ newView }-once"
  97. $scope.$watch "ui.chatOpen", (isOpen) ->
  98. event_tracking.sendMBOnce "ide-open-chat-once" if isOpen
  99. $scope.$watch "ui.leftMenuShown", (isOpen) ->
  100. event_tracking.sendMBOnce "ide-open-left-menu-once" if isOpen
  101. $scope.trackHover = (feature) ->
  102. event_tracking.sendMBOnce "ide-hover-#{feature}-once"
  103. # End of tracking code.
  104. window._ide = ide
  105. ide.validFileRegex = '^[^\*\/]*$' # Don't allow * and /
  106. ide.project_id = $scope.project_id = window.project_id
  107. ide.$scope = $scope
  108. ide.referencesSearchManager = new ReferencesManager(ide, $scope)
  109. ide.connectionManager = new ConnectionManager(ide, $scope)
  110. ide.fileTreeManager = new FileTreeManager(ide, $scope)
  111. ide.editorManager = new EditorManager(ide, $scope)
  112. ide.onlineUsersManager = new OnlineUsersManager(ide, $scope)
  113. ide.historyManager = new HistoryManager(ide, $scope)
  114. ide.pdfManager = new PdfManager(ide, $scope)
  115. ide.permissionsManager = new PermissionsManager(ide, $scope)
  116. ide.binaryFilesManager = new BinaryFilesManager(ide, $scope)
  117. ide.labelsManager = new LabelsManager(ide, $scope, labels)
  118. inited = false
  119. $scope.$on "project:joined", () ->
  120. return if inited
  121. inited = true
  122. if $scope?.project?.deletedByExternalDataSource
  123. ide.showGenericMessageModal("Project Renamed or Deleted", """
  124. This project has either been renamed or deleted by an external data source such as Dropbox.
  125. We don't want to delete your data on ShareLaTeX, so this project still contains your history and collaborators.
  126. If the project has been renamed please look in your project list for a new project under the new name.
  127. """)
  128. $timeout(
  129. () ->
  130. if $scope.permissions.write
  131. ide.labelsManager.loadProjectLabelsFromServer()
  132. _labelsInitialLoadDone = true
  133. , 200
  134. )
  135. DARK_THEMES = [
  136. "ambiance", "chaos", "clouds_midnight", "cobalt", "idle_fingers",
  137. "merbivore", "merbivore_soft", "mono_industrial", "monokai",
  138. "pastel_on_dark", "solarized_dark", "terminal", "tomorrow_night",
  139. "tomorrow_night_blue", "tomorrow_night_bright", "tomorrow_night_eighties",
  140. "twilight", "vibrant_ink"
  141. ]
  142. $scope.darkTheme = false
  143. $scope.$watch "settings.theme", (theme) ->
  144. if theme in DARK_THEMES
  145. $scope.darkTheme = true
  146. else
  147. $scope.darkTheme = false
  148. ide.localStorage = localStorage
  149. ide.browserIsSafari = false
  150. try
  151. userAgent = navigator.userAgent
  152. ide.browserIsSafari = (
  153. userAgent &&
  154. userAgent.match(/.*Safari\/.*/) &&
  155. !userAgent.match(/.*Chrome\/.*/) &&
  156. !userAgent.match(/.*Chromium\/.*/)
  157. )
  158. catch err
  159. console.error err
  160. if ide.browserIsSafari
  161. ide.safariScrollPatcher = new SafariScrollPatcher($scope)
  162. # User can append ?ft=somefeature to url to activate a feature toggle
  163. ide.featureToggle = location?.search?.match(/^\?ft=(\w+)$/)?[1]
  164. angular.bootstrap(document.body, ["SharelatexApp"])