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

216 lines
5.9 KiB
CoffeeScript

define [
"ide/ConnectionManager"
"history/HistoryManager"
"auto-complete/AutoCompleteManager"
"project-members/ProjectMembersManager"
"settings/SettingsManager"
"editor/Editor"
"pdf/PdfManager"
"ide/MainAreaManager"
"ide/SideBarManager"
"ide/TabManager"
"ide/LayoutManager"
"ide/FileUploadManager"
"spelling/SpellingManager"
"search/SearchManager"
"models/Project"
"models/User"
"utils/Modal"
"file-tree/FileTreeManager"
"messages/MessageManager"
"help/HelpManager"
"cursors/CursorManager"
"keys/HotkeysManager"
"keys/BackspaceHighjack"
"file-view/FileViewManager"
"tour/IdeTour"
"analytics/AnalyticsManager"
"track-changes/TrackChangesManager"
"ace/ace"
"libs/jquery.color"
"libs/jquery-layout"
"libs/backbone"
"main"
], (
ConnectionManager,
HistoryManager,
AutoCompleteManager,
ProjectMembers,
SettingsManager,
Editor,
PdfManager,
MainAreaManager,
SideBarManager,
TabManager,
LayoutManager,
FileUploadManager,
SpellingManager,
SearchManager,
Project,
User,
Modal,
FileTreeManager,
MessageManager,
HelpManager,
CursorManager,
HotkeysManager,
BackspaceHighjack,
FileViewManager,
IdeTour,
AnalyticsManager,
TrackChangesManager
) ->
ProjectMembersManager = ProjectMembers.ProjectMembersManager
mainAreaManager = undefined
socket = undefined
currentDoc_id = undefined
selectElement = undefined
security = undefined
_.templateSettings =
interpolate : /\{\{(.+?)\}\}/g
isAllowedToDoIt = (permissionsLevel)->
if permissionsLevel == "owner" && _.include ["owner"], security.permissionsLevel
return true
else if permissionsLevel == "readAndWrite" && _.include ["readAndWrite", "owner"], security.permissionsLevel
return true
else if permissionsLevel == "readOnly" && _.include ["readOnly", "readAndWrite", "owner"], security.permissionsLevel
return true
else
return false
Ide = class Ide
constructor: () ->
@userSettings = window.userSettings
@project_id = @userSettings.project_id
@user = User.findOrBuild window.user.id, window.user
ide = this
@isAllowedToDoIt = isAllowedToDoIt
ioOptions =
reconnect: false
"force new connection": true
@socket = socket = io.connect null, ioOptions
@messageManager = new MessageManager(@)
@connectionManager = new ConnectionManager(@)
@tabManager = new TabManager(@)
@layoutManager = new LayoutManager(@)
@sideBarView = new SideBarManager(@, $("#sections"))
selectElement = @sideBarView.selectElement
mainAreaManager = @mainAreaManager = new MainAreaManager(@, $("#content"))
@fileTreeManager = new FileTreeManager(@)
@editor = new Editor(@)
@pdfManager = new PdfManager(@)
if @userSettings.autoComplete
@autoCompleteManager = new AutoCompleteManager(@)
@spellingManager = new SpellingManager(@)
@fileUploadManager = new FileUploadManager(@)
@searchManager = new SearchManager(@)
@cursorManager = new CursorManager(@)
@fileViewManager = new FileViewManager(@)
@analyticsManager = new AnalyticsManager(@)
if @userSettings.trackChanges
@trackChangesManager = new TrackChangesManager(@)
else
@historyManager = new HistoryManager(@)
@setLoadingMessage("Connecting")
firstConnect = true
socket.on "connect", () =>
@setLoadingMessage("Joining project")
joinProject = () =>
socket.emit 'joinProject', {project_id: @project_id}, (err, project, permissionsLevel, protocolVersion) =>
@hideLoadingScreen()
if @protocolVersion? and @protocolVersion != protocolVersion
location.reload(true)
@protocolVersion = protocolVersion
Security = {}
Security.permissionsLevel = permissionsLevel
@security = security = Object.freeze(Security)
@project = new Project project, parse: true
@project.set("ide", ide)
ide.trigger "afterJoinProject", @project
if firstConnect
@pdfManager.refreshPdf(isAutoCompile:true)
firstConnect = false
setTimeout(joinProject, 100)
showErrorModal: (title, message)->
new Modal {
title: title
message: message
buttons: [ text: "OK" ]
}
showGenericServerErrorMessage: ()->
new Modal {
title: "There was a problem talking to the server"
message: "Sorry, we couldn't complete your request right now. Please wait a few moments and try again. If the problem persists, please let us know."
buttons: [ text: "OK" ]
}
reportError: (error, meta = {}) ->
meta.client_id = @socket?.socket?.sessionid
meta.transport = @socket?.socket?.transport?.name
meta.client_now = new Date()
meta.last_connected = @connectionManager.lastConnected
meta.second_last_connected = @connectionManager.secondLastConnected
meta.last_disconnected = @connectionManager.lastDisconnected
meta.second_last_disconnected = @connectionManager.secondLastDisconnected
errorObj = {}
for key in Object.getOwnPropertyNames(error)
errorObj[key] = error[key]
$.ajax
url: "/error/client"
type: "POST"
data: JSON.stringify
error: errorObj
meta: meta
contentType: "application/json; charset=utf-8"
headers:
"X-Csrf-Token": window.csrfToken
setLoadingMessage: (message) ->
$("#loadingMessage").text(message)
hideLoadingScreen: () ->
$("#loadingScreen").remove()
_.extend(Ide::, Backbone.Events)
window.ide = ide = new Ide()
ide.projectMembersManager = new ProjectMembersManager ide
ide.settingsManager = new SettingsManager ide
ide.helpManager = new HelpManager ide
ide.hotkeysManager = new HotkeysManager ide
ide.layoutManager.resizeAllSplitters()
ide.tourManager = new IdeTour ide
ide.savingAreaManager =
$savingArea : $('#saving-area')
timeOut: undefined
saved:->
@clearTimeout()
$("#savingProblems").hide()
saving:->
return if @timeOut?
@clearTimeout()
@timeOut = setTimeout((=>
ga?('send', 'event', 'editor-interaction', 'notification-shown', "saving")
$("#savingProblems").show()
), 3000)
clearTimeout:->
if @timeOut?
clearTimeout @timeOut
delete @timeOut