ide.coffee 5.3 KB

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