mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-10-25 13:37:12 +08:00
Implement disabled file versioning state [SCI-11040]
This commit is contained in:
parent
2ec13cda9d
commit
6c2c416bbf
6 changed files with 99 additions and 24 deletions
|
|
@ -1362,6 +1362,10 @@ th.custom-field .modal-tooltiptext {
|
|||
cursor: pointer;
|
||||
}
|
||||
|
||||
.tooltip {
|
||||
z-index: 9999;
|
||||
}
|
||||
|
||||
.tooltip-open {
|
||||
background-color: $color-concrete;
|
||||
color: $color-black;
|
||||
|
|
|
|||
|
|
@ -399,13 +399,23 @@ class AssetsController < ApplicationController
|
|||
end
|
||||
|
||||
def versions
|
||||
blobs =
|
||||
[@asset.file.blob] +
|
||||
@asset.previous_files.map(&:blob).sort_by { |b| -1 * b.metadata['version'].to_i }[0..(VersionedAttachments.enabled? ? -1 : 1)]
|
||||
render(
|
||||
json: [@asset.file.blob] +
|
||||
@asset.previous_files.map(&:blob).sort_by { |b| -1 * b.metadata['version'].to_i }
|
||||
json: ActiveModel::SerializableResource.new(
|
||||
blobs,
|
||||
each_serializer: ActiveStorage::BlobSerializer
|
||||
).as_json.merge(
|
||||
enabled: VersionedAttachments.enabled?,
|
||||
enable_url: ENV.fetch('SCINOTE_FILE_VERSIONING_ENABLE_URL', nil)
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
def restore_version
|
||||
render_403 unless VersionedAttachments.enabled?
|
||||
|
||||
@asset.restore_file_version(params[:version].to_i)
|
||||
render json: @asset.file.blob
|
||||
end
|
||||
|
|
|
|||
|
|
@ -9,30 +9,68 @@
|
|||
</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div v-if="fileVersions" v-for="fileVersion in fileVersions" :key="fileVersion.id">
|
||||
<div class="flex w-full border border-sn-light-grey rounded mb-1.5 p-1.5 items-center">
|
||||
<div class="basis-3/4">
|
||||
<div class="mb-1.5">
|
||||
<span class="bg-sn-grey-300 me-2 px-2 py-0.5 rounded">v{{ fileVersion.attributes.version }}</span>
|
||||
<a :href="fileVersion.attributes.url" target="_blank">{{ fileVersion.attributes.filename }}</a>
|
||||
<small class="inline-block" v-if="fileVersion.attributes.restored_from_version">
|
||||
({{ i18n.t("assets.file_versions_modal.restored_from_version", { version: fileVersion.attributes.restored_from_version }) }})
|
||||
</small>
|
||||
<div class="relative" v-if="fileVersions">
|
||||
<div v-for="(fileVersion, index) in fileVersions" :key="fileVersion.id">
|
||||
<div class="flex w-full border border-sn-light-grey rounded mb-1.5 p-1.5 items-center">
|
||||
<div class="basis-3/4">
|
||||
<div class="mb-1.5">
|
||||
<span v-if="fileVersion.attributes.version === 1" class="bg-sn-science-blue text-sn-white me-2 px-2 py-0.5 rounded">
|
||||
{{ i18n.t("assets.file_versions_modal.original_file") }}
|
||||
</span>
|
||||
<span v-else class="bg-sn-grey-300 me-2 px-2 py-0.5 rounded">v{{ fileVersion.attributes.version }}</span>
|
||||
<a :href="fileVersion.attributes.url" target="_blank">{{ fileVersion.attributes.filename }}</a>
|
||||
<small class="inline-block ml-1" v-if="fileVersion.attributes.restored_from_version">
|
||||
({{ i18n.t("assets.file_versions_modal.restored_from_version", { version: fileVersion.attributes.restored_from_version }) }})
|
||||
</small>
|
||||
</div>
|
||||
<div class="flex text-xs text-sn-grey justify-start">
|
||||
<div class="mr-3">{{ fileVersion.attributes.created_at }}</div>
|
||||
<div class="mr-3">{{ fileVersion.attributes.created_by.full_name }}</div>
|
||||
<div>{{ Math.round(fileVersion.attributes.byte_size/1024) }}KB</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex text-xs text-sn-grey justify-start">
|
||||
<div class="mr-3">{{ fileVersion.attributes.created_at }}</div>
|
||||
<div class="mr-3">{{ fileVersion.attributes.created_by.full_name }}</div>
|
||||
<div>{{ (fileVersion.attributes.byte_size/1024).toFixed(1) }}KB</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="basis-1/4 flex justify-end">
|
||||
<a class="btn btn-icon p-0" :href="fileVersion.attributes.url" target="_blank"><i class="sn-icon sn-icon-export"></i></a>
|
||||
<a v-if="restoreVersionUrl" @click="restoreVersion(fileVersion.attributes.version)" class="btn btn-icon p-0 mx-3"><i class="sn-icon sn-icon-restore"></i></a>
|
||||
<div class="basis-1/4 flex justify-end">
|
||||
<a class="btn btn-icon p-0 mr-3"đ
|
||||
v-if="enabled || index === 0"
|
||||
:href="fileVersion.attributes.url"
|
||||
target="_blank"
|
||||
data-render-tooltip="true"
|
||||
:title="i18n.t('assets.file_versions_modal.download')"
|
||||
>
|
||||
<i class="sn-icon sn-icon-export"></i>
|
||||
</a>
|
||||
<a v-if="restoreVersionUrl && index !== 0"
|
||||
@click="restoreVersion(fileVersion.attributes.version)"
|
||||
data-render-tooltip="true"
|
||||
:title="i18n.t('assets.file_versions_modal.restore')"
|
||||
class="btn btn-icon p-0 mr-3"
|
||||
>
|
||||
<i class="sn-icon sn-icon-restore"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="!enabled" class="absolute bottom-0 w-full h-[150px] bg-gradient-to-t from-white to-transparent"></div>
|
||||
</div>
|
||||
<div v-else class="sci-loader"></div>
|
||||
<div v-if="!enabled" class="bg-sn-super-light-blue p-4 rounded flex items-start">
|
||||
<div class="mr-2">
|
||||
<i class="sn-icon sn-icon-upgrade"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="mt-1 mb-2">{{ i18n.t('assets.file_versions_modal.title') }}</h3>
|
||||
{{ i18n.t('assets.file_versions_modal.disabled_disclaimer') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type='button' class='btn btn-secondary' @click="close">
|
||||
{{ i18n.t('general.cancel') }}
|
||||
</button>
|
||||
<a v-if="!enabled" :href="enableUrl" class='btn btn-primary' target="_blank">
|
||||
{{ i18n.t('assets.file_versions_modal.enable_button') }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -58,16 +96,30 @@ export default {
|
|||
mixins: [modalMixin],
|
||||
data() {
|
||||
return {
|
||||
fileVersions: null
|
||||
fileVersions: null,
|
||||
enabled: null,
|
||||
enableUrl: null
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.loadVersions();
|
||||
},
|
||||
beforeUnmount() {
|
||||
document.querySelectorAll('[data-render-tooltip]').forEach((e) => {
|
||||
window.destroyTooltip(e);
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
loadVersions() {
|
||||
axios.get(this.versionsUrl).then((response) => {
|
||||
this.fileVersions = response.data.data;
|
||||
this.enabled = response.data.enabled;
|
||||
this.enableUrl = response.data.enable_url;
|
||||
this.$nextTick(() => {
|
||||
document.querySelectorAll('[data-render-tooltip]').forEach((e) => {
|
||||
window.initTooltip(e);
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
restoreVersion(version) {
|
||||
|
|
|
|||
|
|
@ -46,4 +46,10 @@ module VersionedAttachments
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
module_function
|
||||
|
||||
def enabled?
|
||||
ApplicationSettings.instance.values['storage_locations_enabled']
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -152,11 +152,11 @@ 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),
|
||||
restore_version: asset_restore_version_path(object)
|
||||
rename: asset_rename_path(object)
|
||||
)
|
||||
end
|
||||
|
||||
urls[:restore_version] = asset_restore_version_path(object) if VersionedAttachments.enabled?
|
||||
urls[:open_vector_editor_edit] = edit_gene_sequence_asset_path(object.id) if can_manage_asset?(user, object)
|
||||
|
||||
if can_manage_asset?(user, object) && can_open_asset_locally?(user, object)
|
||||
|
|
|
|||
|
|
@ -4009,9 +4009,12 @@ en:
|
|||
file_versions_modal:
|
||||
title: "Version history"
|
||||
download: "Download"
|
||||
restore: "Restore"
|
||||
restore: "Restore this version"
|
||||
size: "Size"
|
||||
restored_from_version: "restored from v%{version}"
|
||||
original_file: "Original file"
|
||||
enable_button: "Enable"
|
||||
disabled_disclaimer: "This feature is currently disabled"
|
||||
rename_modal:
|
||||
title: "Rename file"
|
||||
min_length_error: "File name must be at least 1 character long."
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue