1
0
Fork 0
mirror of https://github.com/overleaf/overleaf.git synced 2025-04-14 17:33:34 +00:00

Allow restoring of deleted files

This commit is contained in:
James Allen 2014-06-27 17:11:26 +01:00
parent 562f28f412
commit 75f1fb54b6
10 changed files with 129 additions and 36 deletions

View file

@ -39,12 +39,30 @@ aside#file-tree(ng-controller="FileTreeController")
)
i.fa.fa-trash-o
ul.list-unstyled.file-tree-list
file-entity(
entity="entity",
ng-repeat="entity in rootFolder.children | orderBy:[orderByFoldersFirst, 'name']"
)
.file-tree-inner
ul.list-unstyled.file-tree-list
file-entity(
entity="entity",
ng-repeat="entity in rootFolder.children | orderBy:[orderByFoldersFirst, 'name']"
)
div(ng-show="deletedDocs.length > 0 && ui.view == 'track-changes'")
h3 Deleted Files
ul.list-unstyled.file-tree-list.deleted-docs
li(
ng-class="{ 'selected': entity.selected }",
ng-repeat="entity in deletedDocs | orderBy:'name'",
ng-controller="FileTreeEntityController"
)
.entity
.entity-name(
ng-click="select()"
)
//- Just a spacer to align with folders
i.fa.fa-fw.toggle
i.fa.fa-fw.fa-file
span {{ entity.name }}
script(type='text/ng-template', id='entityListItemTemplate')
li(

View file

@ -64,16 +64,25 @@ div#trackChanges(ng-show="ui.view == 'track-changes'")
i.fa.fa-spin.fa-refresh
|   Loading...
.diff.full-size
.diff.full-size(ng-controller="TrackChangesDiffController")
.diff-editor.hide-ace-cursor(
ace-editor,
ng-show="!!trackChanges.diff && !trackChanges.diff.loading",
ng-show="!!trackChanges.diff && !trackChanges.diff.loading && !trackChanges.diff.deleted",
theme="settings.theme",
font-size="settings.fontSize",
text="trackChanges.diff.text",
annotations="trackChanges.diff.annotations",
read-only="true"
)
.diff-deleted.text-centered(
ng-show="trackChanges.diff.deleted"
)
p.text-serif {{ trackChanges.diff.doc.name }} has been deleted.
p
a.btn.btn-primary.btn-lg(
href,
ng-click="restoreDeletedDoc()"
) Restore
.loading-panel(ng-show="trackChanges.diff.loading")
i.fa.fa-spin.fa-refresh
|   Loading...

View file

@ -32,6 +32,8 @@ define [
@openDoc(doc)
openDoc: (doc, options = {}) ->
@$scope.ui.view = "editor"
console.log "Trying to open doc", doc.id
return if doc.id == @$scope.editor.open_doc_id and !options.forceReopen
@$scope.editor.open_doc_id = doc.id

View file

@ -10,6 +10,7 @@ define [
constructor: (@ide, @$scope) ->
@$scope.$on "project:joined", =>
@loadRootFolder()
@loadDeletedDocs()
@$scope.$emit "file-tree:initialized"
@_bindToSocketEvents()
@ -67,8 +68,15 @@ define [
entity.selected = false
entity.selected = true
findEntityById: (id) ->
@_findEntityByIdInFolder @$scope.rootFolder, id
findEntityById: (id, options = {}) ->
entity = @_findEntityByIdInFolder @$scope.rootFolder, id
return entity if entity?
if options.includeDeleted
for entity in @$scope.deletedDocs
return entity if entity.id == id
return null
_findEntityByIdInFolder: (folder, id) ->
for entity in folder.children or []
@ -83,6 +91,9 @@ define [
forEachEntity: (callback = (entity, parent_folder) ->) ->
@_forEachEntityInFolder(@$scope.rootFolder, callback)
for entity in @$scope.deletedDocs or []
callback(entity)
_forEachEntityInFolder: (folder, callback) ->
for entity in folder.children or []
callback(entity, folder)
@ -127,6 +138,16 @@ define [
return folder
loadDeletedDocs: () ->
@$scope.deletedDocs = []
for doc in @$scope.project.deletedDocs
@$scope.deletedDocs.push {
name: doc.name
id: doc._id
type: "doc"
deleted: true
}
getCurrentFolder: () ->
# Return the root folder if nothing is selected
@_getCurrentFolder(@$scope.rootFolder) or @$scope.rootFolder
@ -201,6 +222,10 @@ define [
if index > -1
parent_folder.children.splice(index, 1)
if entity.type == "doc"
entity.deleted = true
@$scope.deletedDocs.push entity
_moveEntityInScope: (entity, parent_folder) ->
return if entity in parent_folder.children
@_deleteEntityFromScope(entity)

View file

@ -1,5 +1,6 @@
define [
"ide/track-changes/TrackChangesListController"
"ide/track-changes/controllers/TrackChangesListController"
"ide/track-changes/controllers/TrackChangesDiffController"
"ide/track-changes/directives/infiniteScroll"
], () ->
class TrackChangesManager
@ -96,24 +97,34 @@ define [
fromV: fromV
toV: toV
doc: doc
loading: true
error: false
}
url = "/project/#{@$scope.project_id}/doc/#{diff.doc.id}/diff"
if diff.fromV? and diff.toV?
url += "?from=#{diff.fromV}&to=#{diff.toV}"
if !doc.deleted
diff.loading = true
url = "/project/#{@$scope.project_id}/doc/#{diff.doc.id}/diff"
if diff.fromV? and diff.toV?
url += "?from=#{diff.fromV}&to=#{diff.toV}"
@ide.$http
.get(url)
.success (data) =>
diff.loading = false
{text, annotations} = @_parseDiff(data)
diff.text = text
diff.annotations = annotations
.error () ->
diff.loading = false
diff.error = true
@ide.$http
.get(url)
.success (data) =>
diff.loading = false
{text, annotations} = @_parseDiff(data)
diff.text = text
diff.annotations = annotations
.error () ->
diff.loading = false
diff.error = true
else
diff.deleted = true
console.log "DOC IS DELETED - NO DIFF FOR YOU!"
restoreDeletedDoc: (doc) ->
@ide.$http.post "/project/#{@$scope.project_id}/doc/#{doc.id}/restore", {
name: doc.name
_csrf: window.csrfToken
}
_parseDiff: (diff) ->
row = 0
@ -170,7 +181,7 @@ define [
for update in updates
for doc_id, doc of update.docs or {}
doc.entity = @ide.fileTreeManager.findEntityById(doc_id)
doc.entity = @ide.fileTreeManager.findEntityById(doc_id, includeDeleted: true)
for user in update.meta.users or []
user.hue = @ide.onlineUsersManager.getHueForUserId(user.id)
@ -220,20 +231,19 @@ define [
affected_docs = {}
for update in @$scope.trackChanges.selection.updates
for doc_id, doc of update.docs
affected_docs[doc_id] = true
affected_docs[doc_id] = doc.entity
selected_doc = @$scope.trackChanges.selection.doc
if selected_doc? and affected_docs[selected_doc.id]
if selected_doc? and affected_docs[selected_doc.id]?
console.log "An affected doc is already open, bravo!"
selected_doc_id = selected_doc.id
else
console.log "selected doc is not open, selecting first one"
for doc_id, doc of affected_docs
selected_doc_id = doc_id
selected_doc = doc
break
doc = @$scope.trackChanges.selection.doc = @ide.fileTreeManager.findEntityById(selected_doc_id)
@ide.fileTreeManager.selectEntity(doc)
@$scope.trackChanges.selection.doc = selected_doc
@ide.fileTreeManager.selectEntity(selected_doc)
_updateContainsUserId: (update, user_id) ->
for user in update.meta.users

View file

@ -0,0 +1,9 @@
define [
"base"
], (App) ->
App.controller "TrackChangesDiffController", ["$scope", "ide", ($scope, ide) ->
$scope.restoreDeletedDoc = () ->
ide.trackChangesManager.restoreDeletedDoc(
$scope.trackChanges.diff.doc
)
]

View file

@ -1,17 +1,27 @@
#file-tree {
aside#file-tree {
background-color: #fafafa;
ul.file-tree-list {
font-size: 0.8rem;
margin: 0;
padding: (@line-height-computed / 4) 0;
.file-tree-inner {
position: absolute;
top: 32px;
bottom: 0;
left: 0;
right: 0;
overflow-y: auto;
}
h3 {
font-size: 1rem;
border-bottom: 1px solid @gray;
padding-bottom: (@line-height-computed / 4);
margin: (@line-height-computed / 2);
}
ul.file-tree-list {
font-size: 0.8rem;
margin: 0;
padding: (@line-height-computed / 4) 0;
ul {
margin-left: (@line-height-computed / 2);

View file

@ -128,6 +128,9 @@
display: none;
}
}
.diff-deleted {
padding: @line-height-computed;
}
}
aside.change-list {

View file

@ -110,6 +110,13 @@ cite { font-style: normal; }
.text-emphasis-variant(@state-danger-text);
}
.text-serif {
font-family: @font-family-serif;
}
.text-centered {
text-align: center;
}
// Contextual backgrounds
// For now we'll leave these alongside the text classes until v4 when we can
// safely shift things around (per SemVer rules).