ide.coffee 5.7 KB

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