overleaf/services/web/public/coffee/ide.coffee

233 lines
7.1 KiB
CoffeeScript
Raw Normal View History

2014-02-12 05:23:40 -05:00
define [
"base"
"ide/file-tree/FileTreeManager"
"ide/connection/ConnectionManager"
"ide/editor/EditorManager"
"ide/online-users/OnlineUsersManager"
"ide/history/HistoryManager"
"ide/history/HistoryV2Manager"
"ide/permissions/PermissionsManager"
"ide/pdf/PdfManager"
"ide/binary-files/BinaryFilesManager"
"ide/references/ReferencesManager"
2017-10-12 10:33:14 -04:00
"ide/metadata/MetadataManager"
"ide/review-panel/ReviewPanelManager"
2016-07-29 12:24:55 -04:00
"ide/SafariScrollPatcher"
"ide/settings/index"
"ide/share/index"
"ide/chat/index"
2014-07-17 09:04:21 -04:00
"ide/clone/index"
2014-07-22 09:38:32 -04:00
"ide/hotkeys/index"
"ide/test-controls/index"
2015-09-14 10:28:19 -04:00
"ide/wordcount/index"
"ide/directives/layout"
2018-02-05 11:56:52 -05:00
"ide/directives/validFile"
"ide/services/ide"
"__IDE_CLIENTSIDE_INCLUDES__"
2014-09-02 08:19:59 -04:00
"analytics/AbTestingManager"
"directives/focus"
"directives/fineUpload"
2014-07-08 07:32:50 -04:00
"directives/scroll"
"directives/onEnter"
"directives/stopPropagation"
"directives/rightClick"
"directives/expandableTextArea"
"directives/videoPlayState"
"services/queued-http"
"services/validateCaptcha"
2018-05-25 08:02:58 -04:00
"services/wait-for"
"filters/formatDate"
2015-03-17 15:14:55 -04:00
"main/event"
"main/account-upgrade"
2014-02-12 05:23:40 -05:00
], (
App
FileTreeManager
ConnectionManager
EditorManager
OnlineUsersManager
HistoryManager
HistoryV2Manager
PermissionsManager
PdfManager
BinaryFilesManager
ReferencesManager
2017-10-12 10:33:14 -04:00
MetadataManager
ReviewPanelManager
2016-07-29 12:24:55 -04:00
SafariScrollPatcher
2014-02-12 05:23:40 -05:00
) ->
App.controller "IdeController", ($scope, $timeout, ide, localStorage, sixpack, event_tracking, metadata, $q) ->
# Don't freak out if we're already in an apply callback
$scope.$originalApply = $scope.$apply
$scope.$apply = (fn = () ->) ->
phase = @$root.$$phase
if (phase == '$apply' || phase == '$digest')
fn()
else
this.$originalApply(fn);
$scope.state = {
loading: true
load_progress: 40
error: null
}
$scope.ui = {
leftMenuShown: false
view: "editor"
chatOpen: false
2014-07-22 08:33:01 -04:00
pdfLayout: 'sideBySide'
2017-10-12 10:33:14 -04:00
pdfHidden: false
pdfWidth: 0
reviewPanelOpen: localStorage("ui.reviewPanelOpen.#{window.project_id}")
miniReviewPanelVisible: false
2017-11-30 10:24:48 -05:00
chatResizerSizeOpen: window.uiConfig.chatResizerSizeOpen
chatResizerSizeClosed: window.uiConfig.chatResizerSizeClosed
defaultFontFamily: window.uiConfig.defaultFontFamily
defaultLineHeight: window.uiConfig.defaultLineHeight
}
$scope.user = window.user
2017-09-25 10:46:29 -04:00
$scope.shouldABTestPlans = false
if $scope.user.signUpDate >= '2018-06-06'
$scope.shouldABTestPlans = true
$scope.settings = window.userSettings
2014-07-21 06:56:49 -04:00
$scope.anonymous = window.anonymous
2017-10-25 05:34:18 -04:00
$scope.isTokenMember = window.isTokenMember
$scope.chat = {}
2014-09-01 12:48:09 -04:00
ide.toggleReviewPanel = $scope.toggleReviewPanel = () ->
if !$scope.project.features.trackChangesVisible
return
2016-10-11 09:24:01 -04:00
$scope.ui.reviewPanelOpen = !$scope.ui.reviewPanelOpen
2017-01-17 09:39:31 -05:00
event_tracking.sendMB "rp-toggle-panel", { value : $scope.ui.reviewPanelOpen }
$scope.$watch "ui.reviewPanelOpen", (value) ->
if value?
localStorage "ui.reviewPanelOpen.#{window.project_id}", value
2017-09-25 10:46:29 -04:00
$scope.$on "layout:pdf:resize", (_, layoutState) ->
$scope.ui.pdfHidden = layoutState.east.initClosed
2017-09-28 06:31:55 -04:00
$scope.ui.pdfWidth = layoutState.east.size
2017-09-25 10:46:29 -04:00
2016-07-05 10:07:16 -04:00
# Tracking code.
$scope.$watch "ui.view", (newView, oldView) ->
if newView? and newView != "editor" and newView != "pdf"
event_tracking.sendMBOnce "ide-open-view-#{ newView }-once"
2016-07-05 10:07:16 -04:00
$scope.$watch "ui.chatOpen", (isOpen) ->
2016-08-10 12:29:43 -04:00
event_tracking.sendMBOnce "ide-open-chat-once" if isOpen
2016-07-05 10:07:16 -04:00
$scope.$watch "ui.leftMenuShown", (isOpen) ->
2016-08-10 12:29:43 -04:00
event_tracking.sendMBOnce "ide-open-left-menu-once" if isOpen
2016-08-03 07:17:19 -04:00
$scope.trackHover = (feature) ->
2016-08-10 12:29:43 -04:00
event_tracking.sendMBOnce "ide-hover-#{feature}-once"
2016-07-05 10:07:16 -04:00
# End of tracking code.
window._ide = ide
ide.validFileRegex = '^[^\*\/]*$' # Don't allow * and /
ide.project_id = $scope.project_id = window.project_id
ide.$scope = $scope
ide.referencesSearchManager = new ReferencesManager(ide, $scope)
ide.connectionManager = new ConnectionManager(ide, $scope)
ide.fileTreeManager = new FileTreeManager(ide, $scope)
ide.editorManager = new EditorManager(ide, $scope, localStorage)
ide.onlineUsersManager = new OnlineUsersManager(ide, $scope)
if window.data.useV2History
ide.historyManager = new HistoryV2Manager(ide, $scope)
else
ide.historyManager = new HistoryManager(ide, $scope)
ide.pdfManager = new PdfManager(ide, $scope)
ide.permissionsManager = new PermissionsManager(ide, $scope)
ide.binaryFilesManager = new BinaryFilesManager(ide, $scope)
2017-10-12 10:33:14 -04:00
ide.metadataManager = new MetadataManager(ide, $scope, metadata)
2014-07-24 11:39:32 -04:00
inited = false
$scope.$on "project:joined", () ->
return if inited
inited = true
if $scope?.project?.deletedByExternalDataSource
2014-07-24 11:39:32 -04:00
ide.showGenericMessageModal("Project Renamed or Deleted", """
This project has either been renamed or deleted by an external data source such as Dropbox.
We don't want to delete your data on ShareLaTeX, so this project still contains your history and collaborators.
If the project has been renamed please look in your project list for a new project under the new name.
""")
$timeout(
() ->
if $scope.permissions.write
2017-10-12 10:33:14 -04:00
ide.metadataManager.loadProjectMetaFromServer()
_labelsInitialLoadDone = true
, 200
)
# Count the first 'doc:opened' as a sign that the ide is loaded
# and broadcast a message. This is a good event to listen for
# if you want to wait until the ide is fully loaded and initialized
_loaded = false
$scope.$on 'doc:opened', () ->
if _loaded
return
$scope.$broadcast('ide:loaded')
_loaded = true
$scope.$on 'cursor:editor:update', event_tracking.editingSessionHeartbeat
DARK_THEMES = [
"ambiance", "chaos", "clouds_midnight", "cobalt", "idle_fingers",
"merbivore", "merbivore_soft", "mono_industrial", "monokai",
"pastel_on_dark", "solarized_dark", "terminal", "tomorrow_night",
"tomorrow_night_blue", "tomorrow_night_bright", "tomorrow_night_eighties",
"twilight", "vibrant_ink"
]
$scope.darkTheme = false
$scope.$watch "settings.theme", (theme) ->
if theme in DARK_THEMES
$scope.darkTheme = true
else
$scope.darkTheme = false
ide.localStorage = localStorage
ide.browserIsSafari = false
try
userAgent = navigator.userAgent
ide.browserIsSafari = (
userAgent &&
userAgent.match(/.*Safari\/.*/) &&
!userAgent.match(/.*Chrome\/.*/) &&
!userAgent.match(/.*Chromium\/.*/)
)
catch err
console.error err
2016-07-29 12:24:55 -04:00
if ide.browserIsSafari
2016-08-01 06:12:50 -04:00
ide.safariScrollPatcher = new SafariScrollPatcher($scope)
2016-07-29 12:24:55 -04:00
# Fix Chrome 61 and 62 text-shadow rendering
browserIsChrome61or62 = false
try
chromeVersion = parseFloat(navigator.userAgent.split(" Chrome/")[1]) || null;
browserIsChrome61or62 = (
chromeVersion?
)
if browserIsChrome61or62
document.styleSheets[0].insertRule(".ace_editor.ace_autocomplete .ace_completion-highlight { text-shadow: none !important; font-weight: bold; }", 1)
catch err
console.error err
2016-04-19 06:53:27 -04:00
# User can append ?ft=somefeature to url to activate a feature toggle
ide.featureToggle = location?.search?.match(/^\?ft=(\w+)$/)?[1]
ide.socket.on 'project:publicAccessLevel:changed', (data) =>
if data.newAccessLevel?
ide.$scope.project.publicAccesLevel = data.newAccessLevel
$scope.$digest()
angular.bootstrap(document.body, ["SharelatexApp"])