2014-02-12 10:23:40 +00:00
|
|
|
define [
|
2014-07-08 11:01:32 +00:00
|
|
|
"base"
|
|
|
|
"ide/file-tree/FileTreeManager"
|
|
|
|
"ide/connection/ConnectionManager"
|
|
|
|
"ide/editor/EditorManager"
|
|
|
|
"ide/online-users/OnlineUsersManager"
|
2016-10-05 10:04:39 +00:00
|
|
|
"ide/history/HistoryManager"
|
2014-07-08 11:01:32 +00:00
|
|
|
"ide/permissions/PermissionsManager"
|
2014-12-01 14:35:12 +00:00
|
|
|
"ide/pdf/PdfManager"
|
2014-07-08 11:01:32 +00:00
|
|
|
"ide/binary-files/BinaryFilesManager"
|
2016-02-08 17:04:27 +00:00
|
|
|
"ide/references/ReferencesManager"
|
2017-06-13 12:29:03 +00:00
|
|
|
"ide/labels/LabelsManager"
|
2016-10-12 16:27:20 +00:00
|
|
|
"ide/review-panel/ReviewPanelManager"
|
2016-07-29 16:24:55 +00:00
|
|
|
"ide/SafariScrollPatcher"
|
2017-09-27 15:35:28 +00:00
|
|
|
"ide/AutoCompileOnboardingController",
|
2017-11-22 16:46:16 +00:00
|
|
|
"ide/LinkSharingOnboardingController",
|
2014-07-08 11:01:32 +00:00
|
|
|
"ide/settings/index"
|
|
|
|
"ide/share/index"
|
|
|
|
"ide/chat/index"
|
2014-07-17 13:04:21 +00:00
|
|
|
"ide/clone/index"
|
2014-07-22 13:38:32 +00:00
|
|
|
"ide/hotkeys/index"
|
2015-09-14 14:28:19 +00:00
|
|
|
"ide/wordcount/index"
|
2014-07-08 11:01:32 +00:00
|
|
|
"ide/directives/layout"
|
|
|
|
"ide/services/ide"
|
2014-09-08 16:33:30 +00:00
|
|
|
"__IDE_CLIENTSIDE_INCLUDES__"
|
2014-09-02 12:19:59 +00:00
|
|
|
"analytics/AbTestingManager"
|
2014-07-08 11:01:32 +00:00
|
|
|
"directives/focus"
|
|
|
|
"directives/fineUpload"
|
2014-07-08 11:32:50 +00:00
|
|
|
"directives/scroll"
|
2014-07-08 11:01:32 +00:00
|
|
|
"directives/onEnter"
|
2014-07-31 13:20:56 +00:00
|
|
|
"directives/stopPropagation"
|
|
|
|
"directives/rightClick"
|
2017-01-25 13:51:33 +00:00
|
|
|
"directives/expandableTextArea"
|
2017-02-09 15:44:15 +00:00
|
|
|
"directives/videoPlayState"
|
2016-02-09 15:13:58 +00:00
|
|
|
"services/queued-http"
|
2014-07-08 11:01:32 +00:00
|
|
|
"filters/formatDate"
|
2015-03-17 19:14:55 +00:00
|
|
|
"main/event"
|
2014-11-24 23:59:55 +00:00
|
|
|
"main/account-upgrade"
|
2014-02-12 10:23:40 +00:00
|
|
|
], (
|
2014-07-08 11:01:32 +00:00
|
|
|
App
|
|
|
|
FileTreeManager
|
|
|
|
ConnectionManager
|
|
|
|
EditorManager
|
|
|
|
OnlineUsersManager
|
2016-10-05 10:04:39 +00:00
|
|
|
HistoryManager
|
2014-07-08 11:01:32 +00:00
|
|
|
PermissionsManager
|
|
|
|
PdfManager
|
|
|
|
BinaryFilesManager
|
2016-02-08 17:04:27 +00:00
|
|
|
ReferencesManager
|
2017-06-13 12:29:03 +00:00
|
|
|
LabelsManager
|
2016-10-12 16:27:20 +00:00
|
|
|
ReviewPanelManager
|
2016-07-29 16:24:55 +00:00
|
|
|
SafariScrollPatcher
|
2014-02-12 10:23:40 +00:00
|
|
|
) ->
|
2014-11-24 23:59:55 +00:00
|
|
|
|
2017-06-12 08:44:32 +00:00
|
|
|
App.controller "IdeController", ($scope, $timeout, ide, localStorage, sixpack, event_tracking, labels) ->
|
2014-07-08 11:01:32 +00:00
|
|
|
# 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()
|
2014-03-31 08:47:36 +00:00
|
|
|
else
|
2014-07-08 11:01:32 +00:00
|
|
|
this.$originalApply(fn);
|
|
|
|
|
|
|
|
$scope.state = {
|
|
|
|
loading: true
|
|
|
|
load_progress: 40
|
2015-03-09 13:57:13 +00:00
|
|
|
error: null
|
2014-07-08 11:01:32 +00:00
|
|
|
}
|
|
|
|
$scope.ui = {
|
|
|
|
leftMenuShown: false
|
|
|
|
view: "editor"
|
|
|
|
chatOpen: false
|
2014-07-22 12:33:01 +00:00
|
|
|
pdfLayout: 'sideBySide'
|
2017-09-25 14:46:29 +00:00
|
|
|
pdfHidden: false,
|
2017-09-28 10:31:55 +00:00
|
|
|
pdfWidth: 0,
|
2017-09-28 13:13:51 +00:00
|
|
|
reviewPanelOpen: localStorage("ui.reviewPanelOpen.#{window.project_id}"),
|
2017-09-26 13:50:45 +00:00
|
|
|
miniReviewPanelVisible: false,
|
2014-07-08 11:01:32 +00:00
|
|
|
}
|
2017-09-27 16:08:58 +00:00
|
|
|
$scope.onboarding = {
|
2017-10-16 09:25:52 +00:00
|
|
|
autoCompile: if window.showAutoCompileOnboarding then 'unseen' else 'dismissed'
|
2017-11-22 16:46:16 +00:00
|
|
|
linkSharing: if window.showLinkSharingOnboarding then 'unseen' else 'dismissed'
|
2014-07-08 11:01:32 +00:00
|
|
|
}
|
|
|
|
$scope.user = window.user
|
2017-09-25 14:46:29 +00:00
|
|
|
|
2016-10-13 12:47:05 +00:00
|
|
|
$scope.shouldABTestPlans = false
|
2016-10-27 08:41:51 +00:00
|
|
|
if $scope.user.signUpDate >= '2016-10-27'
|
2016-10-13 12:47:05 +00:00
|
|
|
$scope.shouldABTestPlans = true
|
|
|
|
|
2014-07-08 11:01:32 +00:00
|
|
|
$scope.settings = window.userSettings
|
2014-07-21 10:56:49 +00:00
|
|
|
$scope.anonymous = window.anonymous
|
2017-10-25 09:34:18 +00:00
|
|
|
$scope.isTokenMember = window.isTokenMember
|
2014-07-08 11:01:32 +00:00
|
|
|
|
|
|
|
$scope.chat = {}
|
2014-09-01 16:48:09 +00:00
|
|
|
|
2016-11-08 16:43:01 +00:00
|
|
|
ide.toggleReviewPanel = $scope.toggleReviewPanel = () ->
|
2017-08-03 14:17:28 +00:00
|
|
|
if !$scope.project.features.trackChangesVisible
|
|
|
|
return
|
2016-10-11 13:24:01 +00:00
|
|
|
$scope.ui.reviewPanelOpen = !$scope.ui.reviewPanelOpen
|
2017-01-17 14:39:31 +00:00
|
|
|
event_tracking.sendMB "rp-toggle-panel", { value : $scope.ui.reviewPanelOpen }
|
2016-11-08 16:43:01 +00:00
|
|
|
|
|
|
|
$scope.$watch "ui.reviewPanelOpen", (value) ->
|
|
|
|
if value?
|
|
|
|
localStorage "ui.reviewPanelOpen.#{window.project_id}", value
|
2016-09-27 10:50:34 +00:00
|
|
|
|
2017-09-25 14:46:29 +00:00
|
|
|
$scope.$on "layout:pdf:resize", (_, layoutState) ->
|
|
|
|
$scope.ui.pdfHidden = layoutState.east.initClosed
|
2017-09-28 10:31:55 +00:00
|
|
|
$scope.ui.pdfWidth = layoutState.east.size
|
2017-09-25 14:46:29 +00:00
|
|
|
|
2016-07-05 14:07:16 +00:00
|
|
|
# Tracking code.
|
|
|
|
$scope.$watch "ui.view", (newView, oldView) ->
|
2016-07-26 16:04:06 +00:00
|
|
|
if newView? and newView != "editor" and newView != "pdf"
|
2016-10-13 12:47:05 +00:00
|
|
|
event_tracking.sendMBOnce "ide-open-view-#{ newView }-once"
|
2016-07-05 14:07:16 +00:00
|
|
|
|
|
|
|
$scope.$watch "ui.chatOpen", (isOpen) ->
|
2016-08-10 16:29:43 +00:00
|
|
|
event_tracking.sendMBOnce "ide-open-chat-once" if isOpen
|
2016-07-05 14:07:16 +00:00
|
|
|
|
|
|
|
$scope.$watch "ui.leftMenuShown", (isOpen) ->
|
2016-08-10 16:29:43 +00:00
|
|
|
event_tracking.sendMBOnce "ide-open-left-menu-once" if isOpen
|
2016-08-03 11:17:19 +00:00
|
|
|
|
|
|
|
$scope.trackHover = (feature) ->
|
2016-08-10 16:29:43 +00:00
|
|
|
event_tracking.sendMBOnce "ide-hover-#{feature}-once"
|
2016-07-05 14:07:16 +00:00
|
|
|
# End of tracking code.
|
2016-01-18 10:29:13 +00:00
|
|
|
|
2014-07-08 11:01:32 +00:00
|
|
|
window._ide = ide
|
2016-10-13 12:47:05 +00:00
|
|
|
|
2016-09-21 15:31:02 +00:00
|
|
|
ide.validFileRegex = '^[^\*\/]*$' # Don't allow * and /
|
2014-07-08 11:01:32 +00:00
|
|
|
|
|
|
|
ide.project_id = $scope.project_id = window.project_id
|
|
|
|
ide.$scope = $scope
|
|
|
|
|
2016-02-08 17:04:27 +00:00
|
|
|
ide.referencesSearchManager = new ReferencesManager(ide, $scope)
|
2014-07-08 11:01:32 +00:00
|
|
|
ide.connectionManager = new ConnectionManager(ide, $scope)
|
|
|
|
ide.fileTreeManager = new FileTreeManager(ide, $scope)
|
|
|
|
ide.editorManager = new EditorManager(ide, $scope)
|
|
|
|
ide.onlineUsersManager = new OnlineUsersManager(ide, $scope)
|
2016-10-05 10:04:39 +00:00
|
|
|
ide.historyManager = new HistoryManager(ide, $scope)
|
2014-07-08 11:01:32 +00:00
|
|
|
ide.pdfManager = new PdfManager(ide, $scope)
|
|
|
|
ide.permissionsManager = new PermissionsManager(ide, $scope)
|
|
|
|
ide.binaryFilesManager = new BinaryFilesManager(ide, $scope)
|
2017-06-13 12:29:03 +00:00
|
|
|
ide.labelsManager = new LabelsManager(ide, $scope, labels)
|
2015-12-17 15:13:02 +00:00
|
|
|
|
2014-07-24 15:39:32 +00:00
|
|
|
inited = false
|
|
|
|
$scope.$on "project:joined", () ->
|
|
|
|
return if inited
|
|
|
|
inited = true
|
2015-02-23 17:33:05 +00:00
|
|
|
if $scope?.project?.deletedByExternalDataSource
|
2014-07-24 15:39:32 +00: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.
|
|
|
|
""")
|
2017-06-14 12:26:02 +00:00
|
|
|
$timeout(
|
|
|
|
() ->
|
|
|
|
if $scope.permissions.write
|
|
|
|
ide.labelsManager.loadProjectLabelsFromServer()
|
|
|
|
_labelsInitialLoadDone = true
|
|
|
|
, 200
|
|
|
|
)
|
2016-02-08 17:04:27 +00:00
|
|
|
|
2017-11-09 15:12:55 +00:00
|
|
|
# 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
|
|
|
|
|
2014-07-28 14:06:26 +00:00
|
|
|
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
|
2014-07-08 11:01:32 +00:00
|
|
|
|
2015-02-12 11:32:27 +00:00
|
|
|
ide.localStorage = localStorage
|
|
|
|
|
2016-04-11 13:35:59 +00:00
|
|
|
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 16:24:55 +00:00
|
|
|
if ide.browserIsSafari
|
2016-08-01 10:12:50 +00:00
|
|
|
ide.safariScrollPatcher = new SafariScrollPatcher($scope)
|
2016-07-29 16:24:55 +00:00
|
|
|
|
2017-09-28 13:01:03 +00:00
|
|
|
# Fix Chrome 61 and 62 text-shadow rendering
|
|
|
|
browserIsChrome61or62 = false
|
|
|
|
try
|
|
|
|
chromeVersion = parseFloat(navigator.userAgent.split(" Chrome/")[1]) || null;
|
|
|
|
browserIsChrome61or62 = (
|
|
|
|
chromeVersion? &&
|
|
|
|
(chromeVersion == 61 || chromeVersion == 62)
|
|
|
|
)
|
|
|
|
if browserIsChrome61or62
|
|
|
|
document.styleSheets[0].insertRule(".ace_editor.ace_autocomplete .ace_completion-highlight { text-shadow: none !important; }", 1)
|
|
|
|
catch err
|
|
|
|
console.error err
|
|
|
|
|
|
|
|
|
2016-04-19 10:53:27 +00:00
|
|
|
# User can append ?ft=somefeature to url to activate a feature toggle
|
|
|
|
ide.featureToggle = location?.search?.match(/^\?ft=(\w+)$/)?[1]
|
|
|
|
|
2017-10-26 10:04:00 +00:00
|
|
|
ide.socket.on 'project:publicAccessLevel:changed', (data) =>
|
|
|
|
if data.newAccessLevel?
|
|
|
|
ide.$scope.project.publicAccesLevel = data.newAccessLevel
|
|
|
|
$scope.$digest()
|
|
|
|
|
2014-12-01 14:35:12 +00:00
|
|
|
angular.bootstrap(document.body, ["SharelatexApp"])
|