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',