diff --git a/web-app/packages/admin-lib/src/modules/admin/views/ProjectVersionView.vue b/web-app/packages/admin-lib/src/modules/admin/views/ProjectVersionView.vue index f5fea30e..ae739a43 100644 --- a/web-app/packages/admin-lib/src/modules/admin/views/ProjectVersionView.vue +++ b/web-app/packages/admin-lib/src/modules/admin/views/ProjectVersionView.vue @@ -134,10 +134,9 @@ watch( function download() { const url = ProjectApi.constructDownloadProjectVersionUrl( - project.value?.namespace, - project.value?.name, + project.value?.id, versionId.value ) - window.location.href = url + projectStore.downloadArchive({ url, versionId: versionId.value }) } diff --git a/web-app/packages/lib/src/modules/project/components/DownloadProgress.vue b/web-app/packages/lib/src/modules/project/components/DownloadProgress.vue index 61f99d48..ca2492dc 100644 --- a/web-app/packages/lib/src/modules/project/components/DownloadProgress.vue +++ b/web-app/packages/lib/src/modules/project/components/DownloadProgress.vue @@ -22,7 +22,11 @@ import { useProjectStore } from '@/modules/project/store' export default defineComponent({ name: 'DownloadProgress', computed: { - ...mapState(useProjectStore, ['project', 'projectDownloading']) + ...mapState(useProjectStore, [ + 'project', + 'projectDownloading', + 'projectDownloadingVersion' + ]) }, methods: { ...mapActions(useProjectStore, ['cancelDownloadArchive']), @@ -30,8 +34,12 @@ export default defineComponent({ this.$toast.add({ group: 'download-progress', severity: 'info', - summary: `Preparing archive`, - detail: `Your project ${this.project?.name} is being prepared for download.`, + summary: `Preparing to download your project ${ + this.projectDownloadingVersion + ? `(version ${this.projectDownloadingVersion})` + : '' + }`, + detail: `Your download will begin automatically once it's ready. Please keep this window open.`, life: undefined }) }, diff --git a/web-app/packages/lib/src/modules/project/components/ProjectVersionsTable.vue b/web-app/packages/lib/src/modules/project/components/ProjectVersionsTable.vue index abac33cd..40d3eed5 100644 --- a/web-app/packages/lib/src/modules/project/components/ProjectVersionsTable.vue +++ b/web-app/packages/lib/src/modules/project/components/ProjectVersionsTable.vue @@ -159,7 +159,8 @@ const downloadClick = (item: ProjectVersionsTableItem) => { url: ProjectApi.constructDownloadProjectVersionUrl( project.value.id, item.name - ) + ), + versionId: item.name }) } diff --git a/web-app/packages/lib/src/modules/project/components/VersionDetailSidebar.vue b/web-app/packages/lib/src/modules/project/components/VersionDetailSidebar.vue index 51ec1002..503f7746 100644 --- a/web-app/packages/lib/src/modules/project/components/VersionDetailSidebar.vue +++ b/web-app/packages/lib/src/modules/project/components/VersionDetailSidebar.vue @@ -83,13 +83,6 @@ export default defineComponent({ }, computed: { ...mapState(useProjectStore, ['project', 'versions']), - downloadUrl() { - return ProjectApi.constructDownloadProjectVersionUrl( - this.project.namespace, - this.project.name, - this.queryId - ) - }, queryId(): string { return this.$route.query.version_id as string }, @@ -120,6 +113,7 @@ export default defineComponent({ }, methods: { ...mapActions(useNotificationStore, ['error']), + ...mapActions(useProjectStore, ['downloadArchive']), async getVersion() { try { const response = await ProjectApi.getProjectVersion( @@ -134,7 +128,11 @@ export default defineComponent({ } }, downloadVersion() { - window.location.href = this.downloadUrl + const url = ProjectApi.constructDownloadProjectVersionUrl( + this.project.id, + this.queryId + ) + this.downloadArchive({ url, versionId: this.queryId }) } } }) diff --git a/web-app/packages/lib/src/modules/project/store.ts b/web-app/packages/lib/src/modules/project/store.ts index 401c264d..5cf79fb2 100644 --- a/web-app/packages/lib/src/modules/project/store.ts +++ b/web-app/packages/lib/src/modules/project/store.ts @@ -8,7 +8,7 @@ import keyBy from 'lodash/keyBy' import omit from 'lodash/omit' import { defineStore, getActivePinia } from 'pinia' -import { DropdownOption, errorUtils, permissionUtils } from '@/common' +import { DropdownOption, permissionUtils } from '@/common' import { getErrorMessage } from '@/common/error_utils' import { waitCursor } from '@/common/html_utils' import { filesDiff } from '@/common/mergin_utils' @@ -80,6 +80,7 @@ export interface ProjectState { versionsChangesetLoading: boolean collaborators: ProjectCollaborator[] projectDownloading: boolean + projectDownloadingVersion: string } export const useProjectStore = defineStore('projectModule', { @@ -106,7 +107,8 @@ export const useProjectStore = defineStore('projectModule', { availableRoles: permissionUtils.getProjectRoleNameValues(), versionsChangesetLoading: false, collaborators: [], - projectDownloading: false + projectDownloading: false, + projectDownloadingVersion: null }), getters: { @@ -708,12 +710,14 @@ export const useProjectStore = defineStore('projectModule', { const notificationStore = useNotificationStore() this.cancelDownloadArchive() this.projectDownloading = true + if (payload.versionId) { + this.projectDownloadingVersion = payload.versionId + } + const errorMessage = 'Failed to download project archive. Please try again later.' const exceedMessage = 'It seems like preparing your ZIP file is taking longer than expected. Please try again in a little while to download your file.' - const fileTooLargeMessage = - 'The requested archive is too large to download. Please use direct download with python client or plugin instead.' const delays = [...Array(3).fill(1000), ...Array(3).fill(3000), 5000] let retryCount = 0 @@ -767,6 +771,7 @@ export const useProjectStore = defineStore('projectModule', { downloadArchiveTimeout = null } this.projectDownloading = false + this.projectDownloadingVersion = null }, constructDownloadProjectUrl(payload: { projectId: string }) { diff --git a/web-app/packages/lib/src/modules/project/types.ts b/web-app/packages/lib/src/modules/project/types.ts index 2e3ca0f2..844e776c 100644 --- a/web-app/packages/lib/src/modules/project/types.ts +++ b/web-app/packages/lib/src/modules/project/types.ts @@ -308,6 +308,7 @@ export interface UpdatePublicFlagParams { export interface DownloadPayload { url: string + versionId?: string } export interface FetchProjectVersionsPayload {