diff --git a/app/controllers/assets_controller.rb b/app/controllers/assets_controller.rb index 314583de4..5fded7712 100644 --- a/app/controllers/assets_controller.rb +++ b/app/controllers/assets_controller.rb @@ -197,7 +197,7 @@ class AssetsController < ApplicationController return render_403 unless can_read_team?(@asset.team) @asset.last_modified_by = current_user - @asset.attach_file_version(io: params.require(:image), filename: orig_file_name, current_user: current_user) + @asset.attach_file_version(io: params.require(:image), filename: orig_file_name) @asset.save! create_edit_image_activity(@asset, current_user, :finish_editing) # release previous image space @@ -405,6 +405,11 @@ class AssetsController < ApplicationController ) end + def restore_version + @asset.restore_file_version(params[:version].to_i) + render json: @asset.file.blob + end + private def load_vars diff --git a/app/javascript/vue/shared/content/attachments/attachment_actions.vue b/app/javascript/vue/shared/content/attachments/attachment_actions.vue index 71561f7c3..6147efa33 100644 --- a/app/javascript/vue/shared/content/attachments/attachment_actions.vue +++ b/app/javascript/vue/shared/content/attachments/attachment_actions.vue @@ -27,6 +27,7 @@ @attachment:changed="$emit('attachment:changed', $event)" @attachment:update="$emit('attachment:update', $event)" @menu-toggle="$emit('attachment:toggle_menu', $event)" + @attachment:versionRestored="$emit('attachment:versionRestored', $event)" :withBorder="withBorder" /> diff --git a/app/javascript/vue/shared/content/attachments/context_menu.vue b/app/javascript/vue/shared/content/attachments/context_menu.vue index 5f9a6a7bb..8d7d67c6d 100644 --- a/app/javascript/vue/shared/content/attachments/context_menu.vue +++ b/app/javascript/vue/shared/content/attachments/context_menu.vue @@ -58,8 +58,10 @@ /> diff --git a/app/javascript/vue/shared/content/attachments/inline.vue b/app/javascript/vue/shared/content/attachments/inline.vue index 14788fc32..d1fec5fb7 100644 --- a/app/javascript/vue/shared/content/attachments/inline.vue +++ b/app/javascript/vue/shared/content/attachments/inline.vue @@ -38,6 +38,7 @@ @attachment:delete="deleteAttachment" @attachment:moved="attachmentMoved" @attachment:uploaded="reloadAttachments" + @attachment:versionRestored="reloadAttachments" @attachment:changed="$emit('attachment:changed', $event)" @attachment:update="$emit('attachment:update', $event)" @attachment:toggle_menu="toggleMenuDropdown" diff --git a/app/javascript/vue/shared/content/attachments/list.vue b/app/javascript/vue/shared/content/attachments/list.vue index d8cdc5ad6..2a2aeb03b 100644 --- a/app/javascript/vue/shared/content/attachments/list.vue +++ b/app/javascript/vue/shared/content/attachments/list.vue @@ -37,6 +37,7 @@ @attachment:delete="deleteAttachment" @attachment:moved="attachmentMoved" @attachment:uploaded="reloadAttachments" + @attachment:versionRestored="reloadAttachments" @attachment:changed="$emit('attachment:changed', $event)" @attachment:update="$emit('attachment:update', $event)" @attachment:toggle_menu="toggleMenuDropdown" diff --git a/app/javascript/vue/shared/content/attachments/thumbnail.vue b/app/javascript/vue/shared/content/attachments/thumbnail.vue index ebdc25442..bc7ac5684 100644 --- a/app/javascript/vue/shared/content/attachments/thumbnail.vue +++ b/app/javascript/vue/shared/content/attachments/thumbnail.vue @@ -54,6 +54,7 @@ @attachment:delete="deleteAttachment" @attachment:moved="attachmentMoved" @attachment:uploaded="reloadAttachments" + @attachment:versionRestored="reloadAttachments" @attachment:changed="$emit('attachment:changed', $event)" @attachment:update="$emit('attachment:update', $event)" @attachment:toggle_menu="toggleMenu" diff --git a/app/javascript/vue/shared/file_versions_modal.vue b/app/javascript/vue/shared/file_versions_modal.vue index 0aeb81b43..47c8ffd7a 100644 --- a/app/javascript/vue/shared/file_versions_modal.vue +++ b/app/javascript/vue/shared/file_versions_modal.vue @@ -28,7 +28,7 @@
- +
@@ -46,7 +46,11 @@ import axios from '../../packs/custom_axios'; export default { name: 'FileVersionsModal', props: { - url: { + versionsUrl: { + type: String, + required: true + }, + restoreVersionUrl: { type: String, required: true } @@ -58,9 +62,20 @@ export default { }; }, created() { - axios.get(this.url).then((response) => { - this.fileVersions = response.data.data; - }); + this.loadVersions(); + }, + methods: { + loadVersions() { + axios.get(this.versionsUrl).then((response) => { + this.fileVersions = response.data.data; + }); + }, + restoreVersion(version) { + axios.post(this.restoreVersionUrl, { version: version }).then(() => { + this.loadVersions(); + this.$emit('fileVersionRestored'); + }); + } } }; diff --git a/app/models/concerns/versioned_attachments.rb b/app/models/concerns/versioned_attachments.rb index 6a32e6963..77159a023 100644 --- a/app/models/concerns/versioned_attachments.rb +++ b/app/models/concerns/versioned_attachments.rb @@ -26,6 +26,24 @@ module VersionedAttachments new_blob.save! end end + + define_method :"restore_#{name}_version" do |version| + ActiveRecord::Base.transaction(requires_new: true) do + blob = __send__(:"previous_#{name.to_s.pluralize}").map(&:blob).find do |b| + (b.metadata['version'] || 1) == version + end + + blob.open do |tmp_file| + new_blob = ActiveStorage::Blob.create_and_upload!( + io: tmp_file, + filename: blob.filename, + metadata: blob.metadata.merge({ 'restored_from_version' => version }) + ) + + __send__(:"attach_#{name}_version", new_blob) + end + end + end end end end diff --git a/app/serializers/asset_serializer.rb b/app/serializers/asset_serializer.rb index ba4fa56ef..51abd6204 100644 --- a/app/serializers/asset_serializer.rb +++ b/app/serializers/asset_serializer.rb @@ -152,7 +152,8 @@ class AssetSerializer < ActiveModel::Serializer duplicate: asset_duplicate_path(object), move_targets: asset_move_tagets_path(object), move: asset_move_path(object), - rename: asset_rename_path(object) + rename: asset_rename_path(object), + restore_version: asset_restore_version_path(object) ) end diff --git a/config/routes.rb b/config/routes.rb index 3358bd239..bdd085d7e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -862,6 +862,7 @@ Rails.application.routes.draw do get 'files/:id/checksum', to: 'assets#checksum', as: 'asset_checksum' get 'files/:id/show', to: 'assets#show', as: 'asset_show' get 'files/:id/versions', to: 'assets#versions', as: 'asset_versions' + post 'files/:id/restore_version', to: 'assets#restore_version', as: 'asset_restore_version' patch 'files/:id/toggle_view_mode', to: 'assets#toggle_view_mode', as: 'toggle_view_mode' get 'files/:id/load_asset', to: 'assets#load_asset', as: 'load_asset' post 'files/:id/update_image', to: 'assets#update_image',