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:
parent
562f28f412
commit
75f1fb54b6
10 changed files with 129 additions and 36 deletions
services/web
app/views/project/editor
public
coffee/app/ide
editor
file-tree
track-changes
stylesheets
|
@ -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(
|
||||
|
|
|
@ -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...
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
define [
|
||||
"base"
|
||||
], (App) ->
|
||||
App.controller "TrackChangesDiffController", ["$scope", "ide", ($scope, ide) ->
|
||||
$scope.restoreDeletedDoc = () ->
|
||||
ide.trackChangesManager.restoreDeletedDoc(
|
||||
$scope.trackChanges.diff.doc
|
||||
)
|
||||
]
|
|
@ -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);
|
||||
|
|
|
@ -128,6 +128,9 @@
|
|||
display: none;
|
||||
}
|
||||
}
|
||||
.diff-deleted {
|
||||
padding: @line-height-computed;
|
||||
}
|
||||
}
|
||||
|
||||
aside.change-list {
|
||||
|
|
|
@ -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).
|
||||
|
|
Loading…
Add table
Reference in a new issue