Skip to content

Commit

Permalink
web/satellite/vuetify-poc: allow file browser downloads
Browse files Browse the repository at this point in the history
This change allows files to be downloaded from within the file browser
of the Vuetify project.

Resolves #6107

Change-Id: I0ac0384711baccb99c0a6d382fe96f318290789b
  • Loading branch information
jewharton authored and Storj Robot committed Aug 31, 2023
1 parent b671641 commit 28d498f
Show file tree
Hide file tree
Showing 4 changed files with 142 additions and 85 deletions.
2 changes: 1 addition & 1 deletion web/satellite/src/store/modules/objectBrowserStore.ts
Expand Up @@ -666,7 +666,7 @@ export const useObjectBrowserStore = defineStore('objectBrowser', () => {
clearAllSelectedFiles();
}

async function download(file): Promise<void> {
async function download(file: BrowserObject): Promise<void> {
assertIsInitialized(state);

const url = await getSignedUrl(state.s3, new GetObjectCommand({
Expand Down
55 changes: 0 additions & 55 deletions web/satellite/vuetify-poc/src/components/BrowserActionsMenu.vue

This file was deleted.

138 changes: 138 additions & 0 deletions web/satellite/vuetify-poc/src/components/BrowserRowActions.vue
@@ -0,0 +1,138 @@
// Copyright (C) 2023 Storj Labs, Inc.
// See LICENSE for copying information.

<template>
<div class="text-no-wrap text-right">
<v-btn
v-if="file.type !== 'folder'"
variant="outlined"
color="default"
size="small"
class="mr-1 text-caption"
density="comfortable"
icon
:loading="isDownloading"
@click="onDownloadClick"
>
<icon-download />
<v-tooltip activator="parent" location="start">Download</v-tooltip>
</v-btn>

<v-btn
variant="outlined"
color="default"
size="small"
class="mr-1 text-caption"
density="comfortable"
icon
>
<v-icon icon="mdi-dots-horizontal" />
<v-menu activator="parent">
<v-list class="pa-2">
<template v-if="file.type !== 'folder'">
<v-list-item density="comfortable" link rounded="lg">
<template #prepend>
<icon-preview />
</template>
<v-list-item-title class="pl-2 text-body-2 font-weight-medium">
Preview
</v-list-item-title>
</v-list-item>

<v-list-item
density="comfortable"
:link="!isDownloading"
rounded="lg"
@click="onDownloadClick"
>
<template #prepend>
<icon-download />
</template>
<v-fade-transition>
<v-list-item-title v-show="!isDownloading" class="pl-2 text-body-2 font-weight-medium">
Download
</v-list-item-title>
</v-fade-transition>
<div v-if="isDownloading" class="browser_actions_menu__loader">
<v-progress-circular indeterminate size="23" width="2" />
</div>
</v-list-item>
</template>

<v-list-item density="comfortable" link rounded="lg">
<template #prepend>
<icon-share bold />
</template>
<v-list-item-title class="pl-2 text-body-2 font-weight-medium">
Share
</v-list-item-title>
</v-list-item>

<v-divider class="my-2" />

<v-list-item density="comfortable" link rounded="lg" base-color="error">
<template #prepend>
<icon-trash bold />
</template>
<v-list-item-title class="pl-2 text-body-2 font-weight-medium">
Delete
</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
</v-btn>
</div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import {
VMenu,
VList,
VListItem,
VListItemTitle,
VDivider,
VProgressCircular,
VFadeTransition,
VIcon,
VBtn,
VTooltip,
} from 'vuetify/components';
import { BrowserObject, useObjectBrowserStore } from '@/store/modules/objectBrowserStore';
import { useNotify } from '@/utils/hooks';
import { AnalyticsErrorEventSource } from '@/utils/constants/analyticsEventNames';
import IconDownload from '@poc/components/icons/IconDownload.vue';
import IconShare from '@poc/components/icons/IconShare.vue';
import IconPreview from '@poc/components/icons/IconPreview.vue';
import IconTrash from '@poc/components/icons/IconTrash.vue';
const obStore = useObjectBrowserStore();
const notify = useNotify();
const props = defineProps<{
file: BrowserObject;
}>();
const isDownloading = ref<boolean>(false);
async function onDownloadClick(): Promise<void> {
isDownloading.value = true;
await obStore.download(props.file).catch((err: Error) => {
err.message = `Error downloading file. ${err.message}`;
notify.notifyError(err, AnalyticsErrorEventSource.FILE_BROWSER_ENTRY);
});
isDownloading.value = false;
}
</script>

<style scoped lang="scss">
.browser_actions_menu__loader {
inset: 0;
position: absolute;
display: flex;
align-items: center;
justify-content: center;
}
</style>
32 changes: 3 additions & 29 deletions web/satellite/vuetify-poc/src/components/BrowserTableComponent.vue
Expand Up @@ -58,32 +58,8 @@
{{ getFormattedDate(item.raw.browserObject) }}
</template>

<template #item.actions>
<div class="text-no-wrap">
<v-btn
variant="outlined"
color="default"
size="small"
class="mr-1 text-caption"
density="comfortable"
icon
>
<icon-download />
<v-tooltip activator="parent" location="start">Download</v-tooltip>
</v-btn>

<v-btn
variant="outlined"
color="default"
size="small"
class="mr-1 text-caption"
density="comfortable"
icon
>
<browser-actions-menu />
<v-icon icon="mdi-dots-horizontal" />
</v-btn>
</div>
<template #item.actions="{ item }: ItemSlotProps">
<browser-row-actions :file="item.raw.browserObject" />
</template>
</v-data-table-server>

Expand Down Expand Up @@ -209,7 +185,6 @@ import {
VToolbarTitle,
VTooltip,
VCarouselItem,
VIcon,
} from 'vuetify/components';
import { VDataTableServer } from 'vuetify/labs/components';
Expand All @@ -222,8 +197,7 @@ import { AnalyticsErrorEventSource } from '@/utils/constants/analyticsEventNames
import { useBucketsStore } from '@/store/modules/bucketsStore';
import IconShare from '@poc/components/icons/IconShare.vue';
import IconDownload from '@poc/components/icons/IconDownload.vue';
import BrowserActionsMenu from '@poc/components/BrowserActionsMenu.vue';
import BrowserRowActions from '@poc/components/BrowserRowActions.vue';
import folderIcon from '@poc/assets/icon-folder-tonal.svg';
import pdfIcon from '@poc/assets/icon-pdf-tonal.svg';
Expand Down

0 comments on commit 28d498f

Please sign in to comment.