ide.coffee 5.0 KB

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