ide.coffee 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. }
  72. $scope.user = window.user
  73. $scope.$watch "project.features.trackChangesVisible", (visible) ->
  74. return if !visible?
  75. $scope.ui.showCollabFeaturesOnboarding = window.showTrackChangesOnboarding and visible
  76. $scope.shouldABTestPlans = false
  77. if $scope.user.signUpDate >= '2016-10-27'
  78. $scope.shouldABTestPlans = true
  79. $scope.settings = window.userSettings
  80. $scope.anonymous = window.anonymous
  81. $scope.chat = {}
  82. ide.toggleReviewPanel = $scope.toggleReviewPanel = () ->
  83. $scope.ui.reviewPanelOpen = !$scope.ui.reviewPanelOpen
  84. event_tracking.sendMB "rp-toggle-panel", { value : $scope.ui.reviewPanelOpen }
  85. $scope.$watch "ui.reviewPanelOpen", (value) ->
  86. if value?
  87. localStorage "ui.reviewPanelOpen.#{window.project_id}", value
  88. # Tracking code.
  89. $scope.$watch "ui.view", (newView, oldView) ->
  90. if newView? and newView != "editor" and newView != "pdf"
  91. event_tracking.sendMBOnce "ide-open-view-#{ newView }-once"
  92. $scope.$watch "ui.chatOpen", (isOpen) ->
  93. event_tracking.sendMBOnce "ide-open-chat-once" if isOpen
  94. $scope.$watch "ui.leftMenuShown", (isOpen) ->
  95. event_tracking.sendMBOnce "ide-open-left-menu-once" if isOpen
  96. $scope.trackHover = (feature) ->
  97. event_tracking.sendMBOnce "ide-hover-#{feature}-once"
  98. # End of tracking code.
  99. window._ide = ide
  100. ide.validFileRegex = '^[^\*\/]*$' # Don't allow * and /
  101. ide.project_id = $scope.project_id = window.project_id
  102. ide.$scope = $scope
  103. ide.referencesSearchManager = new ReferencesManager(ide, $scope)
  104. ide.connectionManager = new ConnectionManager(ide, $scope)
  105. ide.fileTreeManager = new FileTreeManager(ide, $scope)
  106. ide.editorManager = new EditorManager(ide, $scope)
  107. ide.onlineUsersManager = new OnlineUsersManager(ide, $scope)
  108. ide.historyManager = new HistoryManager(ide, $scope)
  109. ide.pdfManager = new PdfManager(ide, $scope)
  110. ide.permissionsManager = new PermissionsManager(ide, $scope)
  111. ide.binaryFilesManager = new BinaryFilesManager(ide, $scope)
  112. inited = false
  113. $scope.$on "project:joined", () ->
  114. return if inited
  115. inited = true
  116. if $scope?.project?.deletedByExternalDataSource
  117. ide.showGenericMessageModal("Project Renamed or Deleted", """
  118. This project has either been renamed or deleted by an external data source such as Dropbox.
  119. We don't want to delete your data on ShareLaTeX, so this project still contains your history and collaborators.
  120. If the project has been renamed please look in your project list for a new project under the new name.
  121. """)
  122. DARK_THEMES = [
  123. "ambiance", "chaos", "clouds_midnight", "cobalt", "idle_fingers",
  124. "merbivore", "merbivore_soft", "mono_industrial", "monokai",
  125. "pastel_on_dark", "solarized_dark", "terminal", "tomorrow_night",
  126. "tomorrow_night_blue", "tomorrow_night_bright", "tomorrow_night_eighties",
  127. "twilight", "vibrant_ink"
  128. ]
  129. $scope.darkTheme = false
  130. $scope.$watch "settings.theme", (theme) ->
  131. if theme in DARK_THEMES
  132. $scope.darkTheme = true
  133. else
  134. $scope.darkTheme = false
  135. ide.localStorage = localStorage
  136. ide.browserIsSafari = false
  137. try
  138. userAgent = navigator.userAgent
  139. ide.browserIsSafari = (
  140. userAgent &&
  141. userAgent.match(/.*Safari\/.*/) &&
  142. !userAgent.match(/.*Chrome\/.*/) &&
  143. !userAgent.match(/.*Chromium\/.*/)
  144. )
  145. catch err
  146. console.error err
  147. if ide.browserIsSafari
  148. ide.safariScrollPatcher = new SafariScrollPatcher($scope)
  149. # User can append ?ft=somefeature to url to activate a feature toggle
  150. ide.featureToggle = location?.search?.match(/^\?ft=(\w+)$/)?[1]
  151. angular.bootstrap(document.body, ["SharelatexApp"])