overleaf/services/web/public/coffee/ide/file-tree/controllers/FileTreeController.coffee

370 lines
10 KiB
CoffeeScript
Raw Normal View History

2014-07-08 07:02:26 -04:00
define [
"base"
], (App) ->
App.controller "FileTreeController", ["$scope", "$modal", "ide", "$rootScope", ($scope, $modal, ide, $rootScope) ->
2014-07-08 07:02:26 -04:00
$scope.openNewDocModal = () ->
$modal.open(
templateUrl: "newDocModalTemplate"
controller: "NewDocModalController"
resolve: {
parent_folder: () -> ide.fileTreeManager.getCurrentFolder()
}
)
$scope.openNewFolderModal = () ->
$modal.open(
templateUrl: "newFolderModalTemplate"
controller: "NewFolderModalController"
resolve: {
parent_folder: () -> ide.fileTreeManager.getCurrentFolder()
}
)
$scope.openUploadFileModal = () ->
$modal.open(
templateUrl: "uploadFileModalTemplate"
controller: "UploadFileModalController"
scope: $scope
resolve: {
parent_folder: () -> ide.fileTreeManager.getCurrentFolder()
}
)
$scope.openLinkedFileModal = window.openLinkedFileModal = () ->
2018-03-01 05:17:12 -05:00
unless 'url' in window.data.enabledLinkedFileTypes
console.warn("Url linked files are not enabled")
return
$modal.open(
templateUrl: "linkedFileModalTemplate"
controller: "LinkedFileModalController"
scope: $scope
resolve: {
parent_folder: () -> ide.fileTreeManager.getCurrentFolder()
}
)
2018-05-15 11:22:47 -04:00
$scope.openProjectLinkedFileModal = window.openProjectLinkedFileModal = () ->
unless 'project_file' in window.data.enabledLinkedFileTypes
2018-05-15 11:22:47 -04:00
console.warn("Project linked files are not enabled")
return
$modal.open(
templateUrl: "projectLinkedFileModalTemplate"
controller: "ProjectLinkedFileModalController"
scope: $scope
resolve: {
parent_folder: () -> ide.fileTreeManager.getCurrentFolder()
}
)
2014-07-08 07:02:26 -04:00
$scope.orderByFoldersFirst = (entity) ->
return '0' if entity?.type == "folder"
2014-07-08 07:02:26 -04:00
return '1'
$scope.startRenamingSelected = () ->
$scope.$broadcast "rename:selected"
$scope.openDeleteModalForSelected = () ->
$scope.$broadcast "delete:selected"
]
App.controller "NewDocModalController", [
"$scope", "ide", "$modalInstance", "$timeout", "parent_folder",
($scope, ide, $modalInstance, $timeout, parent_folder) ->
$scope.inputs =
name: "name.tex"
$scope.state =
inflight: false
$modalInstance.opened.then () ->
$timeout () ->
$scope.$broadcast "open"
, 200
$scope.create = () ->
name = $scope.inputs.name
if !name? or name.length == 0
return
2014-07-08 07:02:26 -04:00
$scope.state.inflight = true
ide.fileTreeManager
.createDoc(name, parent_folder)
.then () ->
2014-07-08 07:02:26 -04:00
$scope.state.inflight = false
$modalInstance.close()
.catch (response)->
{ data } = response
$scope.error = data
$scope.state.inflight = false
2014-07-08 07:02:26 -04:00
$scope.cancel = () ->
$modalInstance.dismiss('cancel')
]
App.controller "NewFolderModalController", [
"$scope", "ide", "$modalInstance", "$timeout", "parent_folder",
($scope, ide, $modalInstance, $timeout, parent_folder) ->
$scope.inputs =
name: "name"
$scope.state =
inflight: false
$modalInstance.opened.then () ->
$timeout () ->
$scope.$broadcast "open"
, 200
$scope.create = () ->
name = $scope.inputs.name
if !name? or name.length == 0
return
$scope.state.inflight = true
2014-07-08 07:02:26 -04:00
ide.fileTreeManager
.createFolder(name, parent_folder)
.then () ->
2014-07-08 07:02:26 -04:00
$scope.state.inflight = false
$modalInstance.close()
.catch (response)->
{ data } = response
$scope.error = data
$scope.state.inflight = false
2014-07-08 07:02:26 -04:00
$scope.cancel = () ->
$modalInstance.dismiss('cancel')
]
App.controller "UploadFileModalController", [
"$scope", "$rootScope", "ide", "$modalInstance", "$timeout", "parent_folder", "$window"
($scope, $rootScope, ide, $modalInstance, $timeout, parent_folder, $window) ->
2014-07-08 07:02:26 -04:00
$scope.parent_folder_id = parent_folder?.id
$scope.tooManyFiles = false
$scope.rateLimitHit = false
$scope.secondsToRedirect = 10
$scope.notLoggedIn = false
$scope.conflicts = []
$scope.control = {}
needToLogBackIn = ->
$scope.notLoggedIn = true
decreseTimeout = ->
$timeout (() ->
if $scope.secondsToRedirect == 0
$window.location.href = "/login?redir=/project/#{ide.project_id}"
else
decreseTimeout()
$scope.secondsToRedirect = $scope.secondsToRedirect - 1
), 1000
decreseTimeout()
$scope.max_files = 40
2014-07-08 07:02:26 -04:00
$scope.onComplete = (error, name, response) ->
$timeout (() ->
uploadCount--
if response.success
$rootScope.$broadcast 'file:upload:complete', response
2014-07-08 07:02:26 -04:00
if uploadCount == 0 and response? and response.success
$modalInstance.close("done")
), 250
$scope.onValidateBatch = (files)->
if files.length > $scope.max_files
$timeout (() ->
$scope.tooManyFiles = true
), 1
return false
else
return true
$scope.onError = (id, name, reason)->
console.log(id, name, reason)
if reason.indexOf("429") != -1
$scope.rateLimitHit = true
else if reason.indexOf("403") != -1
needToLogBackIn()
_uploadTimer = null
uploadIfNoConflicts = () ->
if $scope.conflicts.length == 0
$scope.doUpload()
uploadCount = 0
$scope.onSubmit = (id, name) ->
uploadCount++
if ide.fileTreeManager.existsInFolder($scope.parent_folder_id, name)
$scope.conflicts.push name
$scope.$apply()
if !_uploadTimer?
_uploadTimer = setTimeout () ->
_uploadTimer = null
uploadIfNoConflicts()
, 0
return true
$scope.onCancel = (id, name) ->
uploadCount--
index = $scope.conflicts.indexOf(name)
if index > -1
$scope.conflicts.splice(index, 1)
$scope.$apply()
uploadIfNoConflicts()
$scope.doUpload = () ->
$scope.control?.q?.uploadStoredFiles()
2014-07-08 07:02:26 -04:00
$scope.cancel = () ->
$modalInstance.dismiss('cancel')
]
2018-05-15 11:22:47 -04:00
App.controller "ProjectLinkedFileModalController", [
"$scope", "ide", "$modalInstance", "$timeout", "parent_folder",
($scope, ide, $modalInstance, $timeout, parent_folder) ->
$scope.data =
projects: null # or []
2018-05-16 08:26:59 -04:00
selectedProjectId: null
2018-05-15 11:22:47 -04:00
projectEntities: null # or []
selectedProjectEntity: null
name: null
2018-05-15 11:22:47 -04:00
$scope.state =
2018-05-16 06:49:10 -04:00
inFlight:
projects: false
entities: false
create: false
2018-05-15 11:22:47 -04:00
error: false
2018-05-16 08:26:59 -04:00
$scope.$watch 'data.selectedProjectId', (newVal, oldVal) ->
2018-05-15 11:22:47 -04:00
return if !newVal
$scope.data.selectedProjectEntity = null
2018-05-16 08:26:59 -04:00
$scope.getProjectEntities($scope.data.selectedProjectId)
2018-05-15 11:22:47 -04:00
# auto-set filename based on selected file
$scope.$watch 'data.selectedProjectEntity', (newVal, oldVal) ->
return if !newVal
fileName = newVal.split('/').reverse()[0]
if fileName
$scope.data.name = fileName
_setInFlight = (type) ->
2018-05-16 08:26:59 -04:00
$scope.state.inFlight[type] = true
_reset = (opts) ->
isError = opts.err == true
2018-05-16 06:49:10 -04:00
inFlight = $scope.state.inFlight
inFlight.projects = inFlight.entities = inFlight.create = false
2018-05-15 11:22:47 -04:00
$scope.state.error = isError
$scope.shouldEnableProjectSelect = () ->
2018-05-25 11:03:45 -04:00
{ state, data } = $scope
2018-05-16 06:49:10 -04:00
return !state.inFlight.projects && data.projects
2018-05-15 11:22:47 -04:00
$scope.shouldEnableProjectEntitySelect = () ->
2018-05-25 11:03:45 -04:00
{ state, data } = $scope
2018-05-16 08:26:59 -04:00
return !state.inFlight.projects && !state.inFlight.entities && data.projects && data.selectedProjectId
2018-05-15 11:22:47 -04:00
$scope.shouldEnableCreateButton = () ->
state = $scope.state
data = $scope.data
2018-05-16 06:49:10 -04:00
return !state.inFlight.projects &&
!state.inFlight.entities &&
2018-05-15 11:22:47 -04:00
data.projects &&
2018-05-16 08:26:59 -04:00
data.selectedProjectId &&
2018-05-15 11:22:47 -04:00
data.projectEntities &&
data.selectedProjectEntity &&
data.name
2018-05-15 11:22:47 -04:00
$scope.getUserProjects = () ->
_setInFlight('projects')
2018-05-15 11:22:47 -04:00
ide.$http.get("/user/projects", {
_csrf: window.csrfToken
})
.then (resp) ->
$scope.data.projectEntities = null
$scope.data.projects = resp.data.projects.filter (p) ->
p._id != ide.project_id
_reset(err: false)
2018-05-15 11:22:47 -04:00
.catch (err) ->
_reset(err: true)
2018-05-15 11:22:47 -04:00
$scope.getProjectEntities = (project_id) =>
_setInFlight('entities')
2018-05-15 11:22:47 -04:00
ide.$http.get("/project/#{project_id}/entities", {
_csrf: window.csrfToken
})
.then (resp) ->
2018-05-16 08:26:59 -04:00
if $scope.data.selectedProjectId == resp.data.project_id
2018-05-15 11:22:47 -04:00
$scope.data.projectEntities = resp.data.entities
_reset(err: false)
2018-05-15 11:22:47 -04:00
.catch (err) ->
_reset(err: true)
2018-05-15 11:22:47 -04:00
$scope.init = () ->
$scope.getUserProjects()
$timeout($scope.init, 0)
2018-05-15 11:22:47 -04:00
$scope.create = () ->
projectId = $scope.data.selectedProjectId
path = $scope.data.selectedProjectEntity
name = $scope.data.name
if !name || !path || !projectId
_reset(err: true)
2018-05-16 08:26:59 -04:00
return
_setInFlight('create')
ide.fileTreeManager
.createLinkedFile(name, parent_folder, 'project_file', {
source_project_id: projectId,
source_entity_path: path
})
.then () ->
_reset(err: false)
$modalInstance.close()
.catch (response)->
{ data } = response
_reset(err: true)
2018-05-15 11:22:47 -04:00
$scope.cancel = () ->
$modalInstance.dismiss('cancel')
]
# TODO: rename all this to UrlLinkedFilModalController
App.controller "LinkedFileModalController", [
"$scope", "ide", "$modalInstance", "$timeout", "parent_folder",
($scope, ide, $modalInstance, $timeout, parent_folder) ->
$scope.inputs =
name: ""
url: ""
$scope.nameChangedByUser = false
$scope.state =
inflight: false
$modalInstance.opened.then () ->
$timeout () ->
$scope.$broadcast "open"
, 200
$scope.$watch "inputs.url", (url) ->
if url? and url != "" and !$scope.nameChangedByUser
url = url.replace("://", "") # Ignore http:// etc
parts = url.split("/").reverse()
if parts.length > 1 # Wait for at one /
$scope.inputs.name = parts[0]
$scope.create = () ->
{name, url} = $scope.inputs
if !name? or name.length == 0
return
if !url? or url.length == 0
return
$scope.state.inflight = true
ide.fileTreeManager
.createLinkedFile(name, parent_folder, 'url', {url})
.then () ->
$scope.state.inflight = false
$modalInstance.close()
.catch (response)->
{ data } = response
$scope.error = data
$scope.state.inflight = false
$scope.cancel = () ->
$modalInstance.dismiss('cancel')
]