TrackChangesManager.coffee 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. define [
  2. "track-changes/models/ChangeList"
  3. "track-changes/models/Diff"
  4. "track-changes/ChangeListView"
  5. "track-changes/DiffView"
  6. "utils/Modal"
  7. "moment"
  8. ], (ChangeList, Diff, ChangeListView, DiffView, Modal, moment) ->
  9. class TrackChangesManager
  10. template: $("#trackChangesPanelTemplate").html()
  11. constructor: (@ide) ->
  12. @$el = $(@template)
  13. $("#editorWrapper").append(@$el)
  14. @hide()
  15. @ide.editor.on "change:doc", () =>
  16. @hide()
  17. @$el.find(".track-changes-close").on "click", (e) =>
  18. e.preventDefault
  19. @hide()
  20. show: () ->
  21. @project_id = window.userSettings.project_id
  22. @doc_id = @ide.editor.current_doc_id
  23. @changes = new ChangeList([], doc_id: @doc_id, project_id: @project_id)
  24. @changeListView = new ChangeListView(
  25. collection : @changes,
  26. el : @$el.find(".change-list-area")
  27. )
  28. @changeListView.render()
  29. @changeListView.loadUntilFull (error) =>
  30. @autoSelectDiff()
  31. @changeListView.on "change_diff", (fromModel, toModel) =>
  32. @showDiff(fromModel, toModel)
  33. @changeListView.on "restore", (change) =>
  34. @restore(change)
  35. @showEl()
  36. autoSelectDiff: () ->
  37. if @changes.models.length == 0
  38. return
  39. # Find all change until the last one we made
  40. fromIndex = null
  41. for change, i in @changes.models
  42. if ide.user in change.get("users")
  43. if i > 0
  44. fromIndex = i - 1
  45. else
  46. fromIndex = 0
  47. break
  48. fromIndex = 0 if !fromIndex
  49. toChange = @changes.models[0]
  50. fromChange = @changes.models[fromIndex]
  51. @showDiff(fromChange, toChange)
  52. @changeListView.setSelectionRange(fromIndex, 0)
  53. showDiff: (fromModel, toModel) ->
  54. @diff = new Diff({
  55. project_id: @project_id
  56. doc_id: @doc_id
  57. from: fromModel.get("fromVersion")
  58. to: toModel.get("toVersion")
  59. })
  60. @diffView = new DiffView(
  61. model: @diff
  62. el: @$el.find(".track-changes-diff")
  63. )
  64. @diff.fetch()
  65. showEl: ->
  66. @ide.editor.hide()
  67. @$el.show()
  68. hide: () ->
  69. @ide.editor.show()
  70. @$el.hide()
  71. restore: (change) ->
  72. name = @ide.fileTreeManager.getNameOfEntityId(@doc_id)
  73. date = moment(change.get("start_ts")).format("Do MMM YYYY, h:mm:ss a")
  74. modal = new Modal({
  75. title: "Restore document"
  76. message: "Are you sure you want to restore <strong>#{name}</strong> to before the changes on #{date}?"
  77. buttons: [{
  78. text: "Cancel"
  79. }, {
  80. text: "Restore"
  81. class: "btn-success"
  82. close: false
  83. callback: ($button) =>
  84. $button.text("Restoring...")
  85. $button.prop("disabled", true)
  86. @doRestore change.get("version"), (error) =>
  87. modal.remove()
  88. @hide()
  89. }]
  90. })
  91. doRestore: (version, callback = (error) ->) ->
  92. $.ajax {
  93. url: "/project/#{@project_id}/doc/#{@doc_id}/version/#{version}/restore"
  94. type: "POST"
  95. headers:
  96. "X-CSRF-Token": window.csrfToken
  97. success: () ->
  98. callback()
  99. error: (error) ->
  100. callback(error)
  101. }
  102. return TrackChangesManager