Unverified Commit 5d04dd33 authored by Marius van den Beek's avatar Marius van den Beek Committed by GitHub
Browse files

Merge pull request #14124 from guerler/allow_meta_download

[22.05] Allow downloading individual metadata files in History
parents 076f5e4b 224af170
Loading
Loading
Loading
Loading
+7 −15
Original line number Diff line number Diff line
@@ -5,15 +5,7 @@
                <b-button v-if="showError" class="px-1" title="Error" size="sm" variant="link" @click.stop="onError">
                    <span class="fa fa-bug" />
                </b-button>
                <b-button
                    v-if="showDownloads"
                    class="download-btn px-1"
                    title="Download"
                    size="sm"
                    variant="link"
                    @click.stop="onDownload">
                    <span class="fa fa-save" />
                </b-button>
                <dataset-download v-if="showDownloads" :item="item" @on-download="onDownload" />
                <b-button
                    v-if="showDownloads"
                    class="px-1"
@@ -69,20 +61,20 @@

<script>
import { legacyNavigationMixin } from "components/plugins/legacyNavigation";
import { prependPath } from "utils/redirect";
import { copy as sendToClipboard } from "utils/clipboard";
import { absPath } from "utils/redirect";
import DatasetDownload from "./DatasetDownload";

export default {
    components: {
        DatasetDownload,
    },
    mixins: [legacyNavigationMixin],
    props: {
        item: { type: Object, required: true },
        showHighlight: { type: Boolean, default: false },
    },
    computed: {
        downloadUrl() {
            return prependPath(`api/datasets/${this.item.id}/display?to_ext=${this.item.extension}`);
        },
        showDownloads() {
            return !this.item.purged && ["ok", "failed_metadata", "error"].includes(this.item.state);
        },
@@ -110,8 +102,8 @@ export default {
            const msg = this.localize("Link is copied to your clipboard");
            sendToClipboard(absPath(this.downloadUrl), msg);
        },
        onDownload() {
            window.location.href = this.downloadUrl;
        onDownload(resource) {
            window.location.href = resource;
        },
        onError() {
            this.backboneRoute("datasets/error", { dataset_id: this.item.id });
+43 −0
Original line number Diff line number Diff line
import { mount } from "@vue/test-utils";
import { getLocalVue } from "jest/helpers";
import DatasetDownload from "./DatasetDownload";

const localVue = getLocalVue();

const items = [
    { id: "item_id", extension: "ext", meta_files: [{ file_type: "a" }, { file_type: "b" }] },
    { id: "item_id", extension: "ext", meta_files: [] },
];

describe("DatasetDownload", () => {
    let wrapper;

    beforeEach(() => {
        wrapper = mount(DatasetDownload, {
            propsData: {
                item: items[0],
            },
            localVue,
        });
    });

    it("checks basics", async () => {
        const dropdownItems = wrapper.findAll(".dropdown-item");
        expect(dropdownItems.length).toBe(3);
        expect(dropdownItems.at(0).text()).toBe("Download Dataset");
        expect(dropdownItems.at(1).text()).toBe("Download a");
        expect(dropdownItems.at(2).text()).toBe("Download b");
        for (let i = 0; i < dropdownItems.length; i++) {
            await dropdownItems.at(i).trigger("click");
        }
        await wrapper.setProps({ item: items[1] });
        const foundItems = wrapper.find(".dropdown-item").exists();
        expect(foundItems).toBe(false);
        await wrapper.trigger("click");
        const emitted = wrapper.emitted()["on-download"];
        expect(emitted[0][0]).toBe(`/api/datasets/item_id/display?to_ext=ext`);
        expect(emitted[1][0]).toBe(`/api/datasets/item_id/metadata_file?metadata_file=a`);
        expect(emitted[2][0]).toBe(`/api/datasets/item_id/metadata_file?metadata_file=b`);
        expect(emitted[3][0]).toBe(`/api/datasets/item_id/display?to_ext=ext`);
    });
});
+64 −0
Original line number Diff line number Diff line
<template>
    <b-dropdown
        v-if="hasMetaFiles"
        dropup
        no-caret
        no-flip
        v-b-tooltip.top.hover
        size="sm"
        variant="link"
        toggle-class="text-decoration-none"
        title="Download"
        class="download-btn"
        data-description="dataset download">
        <template v-slot:button-content>
            <span class="fa fa-save" />
        </template>
        <b-dropdown-item v-localize @click.stop="onDownload(downloadUrl)"> Download Dataset </b-dropdown-item>
        <b-dropdown-item
            v-for="(metaFile, index) of metaFiles"
            :key="index"
            :data-description="`download ${metaFile.file_type}`"
            @click.stop="onDownload(metaDownloadUrl, metaFile.file_type)">
            Download {{ metaFile.file_type }}
        </b-dropdown-item>
    </b-dropdown>
    <b-button
        v-else
        class="download-btn px-1"
        title="Download"
        size="sm"
        variant="link"
        @click.stop="onDownload(downloadUrl)">
        <span class="fa fa-save" />
    </b-button>
</template>

<script>
import { prependPath } from "utils/redirect";

export default {
    props: {
        item: { type: Object, required: true },
    },
    computed: {
        downloadUrl() {
            return prependPath(`api/datasets/${this.item.id}/display?to_ext=${this.item.extension}`);
        },
        hasMetaFiles() {
            return this.metaFiles && this.metaFiles.length > 0;
        },
        metaDownloadUrl() {
            return prependPath(`api/datasets/${this.item.id}/metadata_file?metadata_file=`);
        },
        metaFiles() {
            return this.item.meta_files;
        },
    },
    methods: {
        onDownload(resource, extension = "") {
            this.$emit("on-download", `${resource}${extension}`);
        },
    },
};
</script>
+3 −1
Original line number Diff line number Diff line
@@ -371,7 +371,9 @@ export var DatasetListItemView = _super.extend(
                        ${_.map(
                            this.model.get("meta_files"),
                            (meta_file) =>
                                `<a class="dropdown-item" href="${urls.meta_download + meta_file.file_type}">
                                `<a class="dropdown-item" href="${
                                    urls.meta_download + meta_file.file_type
                                }" data-description="download ${meta_file.file_type}">
                                    ${_l("Download")} ${meta_file.file_type}
                                </a>`
                        )}
+1 −0
Original line number Diff line number Diff line
@@ -184,6 +184,7 @@ history_panel:
      download_button: '${_} .download-btn'
      info_button: '${_} .params-btn'
      alltags: '${_} .alltags .ti-tags'
      metadata_file_download: '${_} [data-description="download ${metadata_name}"]'

      dataset_operations_dropdown: '${_}  .dataset-actions'

Loading