mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-10-09 21:36:44 +08:00
188 lines
6 KiB
Vue
188 lines
6 KiB
Vue
<template>
|
|
<div class="asset-context-menu"
|
|
ref="menu"
|
|
>
|
|
<a class="marvinjs-edit-button hidden"
|
|
v-if="attachment.attributes.asset_type == 'marvinjs' && attachment.attributes.urls.marvin_js_start_edit"
|
|
ref="marvinjsEditButton"
|
|
:data-sketch-id="attachment.id"
|
|
:data-update-url="attachment.attributes.urls.marvin_js"
|
|
:data-sketch-start-edit-url="attachment.attributes.urls.marvin_js_start_edit"
|
|
:data-sketch-name="attachment.attributes.metadata.name"
|
|
:data-sketch-description="attachment.attributes.metadata.description"
|
|
></a>
|
|
<a class="image-edit-button hidden"
|
|
v-if="attachment.attributes.asset_type != 'marvinjs'
|
|
&& attachment.attributes.image_editable
|
|
&& attachment.attributes.urls.start_edit_image"
|
|
ref="imageEditButton"
|
|
:data-image-id="attachment.id"
|
|
:data-image-name="attachment.attributes.file_name"
|
|
:data-image-url="attachment.attributes.urls.asset_file"
|
|
:data-image-quality="attachment.attributes.image_context.quality"
|
|
:data-image-mime-type="attachment.attributes.image_context.type"
|
|
:data-image-start-edit-url="attachment.attributes.urls.start_edit_image"
|
|
></a>
|
|
<MenuDropdown
|
|
class="ml-auto"
|
|
:listItems="this.menu"
|
|
:btnClasses="`btn icon-btn bg-sn-white ${ withBorder ? 'btn-secondary' : 'btn-light'}`"
|
|
:position="'right'"
|
|
:btnIcon="'sn-icon sn-icon-more-hori'"
|
|
@delete="deleteModal = true"
|
|
@rename="renameModal = true"
|
|
@duplicate="duplicate"
|
|
@viewMode="changeViewMode"
|
|
@move="showMoveModal"
|
|
@fileVersionsModal="fileVersionsModal = true"
|
|
@menu-toggle="$emit('menu-toggle', $event)"
|
|
></MenuDropdown>
|
|
<Teleport to="body">
|
|
<RenameAttachmentModal
|
|
v-if="renameModal"
|
|
:attachment="attachment"
|
|
@attachment:update="$emit('attachment:update', $event)"
|
|
@close="renameModal = false"
|
|
/>
|
|
<deleteAttachmentModal
|
|
v-if="deleteModal"
|
|
:fileName="attachment.attributes.file_name"
|
|
@confirm="deleteAttachment"
|
|
@cancel="deleteModal = false"
|
|
/>
|
|
<MoveAssetModal
|
|
v-if="movingAttachment"
|
|
:parent_type="attachment.attributes.parent_type"
|
|
:targets_url="attachment.attributes.urls.move_targets"
|
|
@confirm="moveAttachment($event)" @cancel="closeMoveModal"
|
|
/>
|
|
<FileVersionsModal
|
|
v-if="fileVersionsModal"
|
|
:versionsUrl="attachment.attributes.urls.versions"
|
|
:restoreVersionUrl="attachment.attributes.urls.restore_version"
|
|
@close="fileVersionsModal = false"
|
|
@fileVersionRestored="$emit('attachment:versionRestored', $event)"
|
|
/>
|
|
</Teleport>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import RenameAttachmentModal from '../modal/rename_modal.vue';
|
|
import deleteAttachmentModal from './delete_modal.vue';
|
|
import MoveAssetModal from '../modal/move.vue';
|
|
import MoveMixin from './mixins/move.js';
|
|
import MenuDropdown from '../../menu_dropdown.vue';
|
|
import FileVersionsModal from '../../file_versions_modal.vue';
|
|
import axios from '../../../../packs/custom_axios.js';
|
|
|
|
export default {
|
|
name: 'contextMenu',
|
|
components: {
|
|
RenameAttachmentModal,
|
|
deleteAttachmentModal,
|
|
MoveAssetModal,
|
|
FileVersionsModal,
|
|
MenuDropdown
|
|
},
|
|
mixins: [MoveMixin],
|
|
props: {
|
|
attachment: {
|
|
type: Object,
|
|
required: true
|
|
},
|
|
withBorder: { default: false, type: Boolean },
|
|
displayInDropdown: {
|
|
type: Array,
|
|
default: []
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
viewModeOptions: ['inline', 'thumbnail', 'list'],
|
|
deleteModal: false,
|
|
renameModal: false,
|
|
fileVersionsModal: false
|
|
};
|
|
},
|
|
computed: {
|
|
menu() {
|
|
const menu = [];
|
|
if (this.displayInDropdown.includes('download')) {
|
|
menu.push({
|
|
text: this.i18n.t('Download'),
|
|
url: this.attachment.attributes.urls.download,
|
|
url_target: '_blank',
|
|
data_e2e: 'e2e-BT-attachmentOptions-download'
|
|
});
|
|
}
|
|
if (this.attachment.attributes.urls.duplicate) {
|
|
menu.push({
|
|
text: this.i18n.t('assets.context_menu.duplicate'),
|
|
emit: 'duplicate'
|
|
});
|
|
}
|
|
if (this.attachment.attributes.urls.rename) {
|
|
menu.push({
|
|
text: this.i18n.t('assets.context_menu.rename'),
|
|
emit: 'rename'
|
|
});
|
|
}
|
|
if (this.attachment.attributes.urls.delete) {
|
|
menu.push({
|
|
text: this.i18n.t('assets.context_menu.delete'),
|
|
emit: 'delete',
|
|
data_e2e: 'e2e-BT-attachmentOptions-delete'
|
|
});
|
|
}
|
|
if (this.attachment.attributes.urls.versions) {
|
|
menu.push({
|
|
text: this.i18n.t('assets.context_menu.versions'),
|
|
emit: 'fileVersionsModal'
|
|
});
|
|
}
|
|
if (this.attachment.attributes.urls.toggle_view_mode) {
|
|
this.viewModeOptions.forEach((viewMode, i) => {
|
|
menu.push({
|
|
active: this.attachment.attributes.view_mode === viewMode,
|
|
text: this.i18n.t(`assets.context_menu.${viewMode}_html`),
|
|
emit: 'viewMode',
|
|
params: viewMode,
|
|
data_e2e: `e2e-BT-attachmentOptions-${viewMode}`,
|
|
dividerBefore: i === 0
|
|
});
|
|
});
|
|
}
|
|
return menu;
|
|
}
|
|
},
|
|
methods: {
|
|
changeViewMode(viewMode) {
|
|
this.$emit('attachment:viewMode', viewMode);
|
|
$.ajax({
|
|
url: this.attachment.attributes.urls.toggle_view_mode,
|
|
type: 'PATCH',
|
|
dataType: 'json',
|
|
data: { asset: { view_mode: viewMode } }
|
|
});
|
|
},
|
|
duplicate() {
|
|
axios.post(this.attachment.attributes.urls.duplicate).then(() => {
|
|
this.reloadAttachments();
|
|
}).catch((e) => {
|
|
console.error(e);
|
|
});
|
|
},
|
|
deleteAttachment() {
|
|
this.deleteModal = false;
|
|
this.$emit('attachment:delete');
|
|
},
|
|
openOVEditor(url) {
|
|
window.showIFrameModal(url);
|
|
},
|
|
reloadAttachments() {
|
|
this.$emit('attachment:uploaded');
|
|
}
|
|
}
|
|
};
|
|
</script>
|