ide.coffee 5.1 KB

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