From fc9048fc94cd8e07383fb79a837a0ea45c4829fe Mon Sep 17 00:00:00 2001 From: xds Date: Mon, 16 Feb 2026 17:37:41 +0300 Subject: [PATCH] feat: Implement multi-select and download functionality for gallery images and add `npm install` to the deployment script. --- deploy.sh | 1 + src/views/IdeaDetailView.vue | 172 +++++++++++++++++++++++++++++------ 2 files changed, 146 insertions(+), 27 deletions(-) diff --git a/deploy.sh b/deploy.sh index b043f82..e294442 100755 --- a/deploy.sh +++ b/deploy.sh @@ -2,6 +2,7 @@ ssh root@31.59.58.220 " cd /root/ai/ai-service-front && git pull && + npm install && npm run build && cp -r dist/* /var/www/ai.luminic.space/ " \ No newline at end of file diff --git a/src/views/IdeaDetailView.vue b/src/views/IdeaDetailView.vue index e172d5e..4d03738 100644 --- a/src/views/IdeaDetailView.vue +++ b/src/views/IdeaDetailView.vue @@ -625,6 +625,72 @@ const deleteIdea = () => { }) } +// --- Gallery Multi-Select & Download --- +const isSelectMode = ref(false) +const selectedAssetIds = ref(new Set()) +const isDownloading = ref(false) + +const toggleSelectMode = () => { + isSelectMode.value = !isSelectMode.value + if (!isSelectMode.value) selectedAssetIds.value = new Set() +} + +const toggleImageSelection = (assetId) => { + const s = new Set(selectedAssetIds.value) + if (s.has(assetId)) s.delete(assetId) + else s.add(assetId) + selectedAssetIds.value = s +} + +const selectAllGallery = () => { + if (selectedAssetIds.value.size === allGalleryImages.value.length) { + selectedAssetIds.value = new Set() + } else { + selectedAssetIds.value = new Set(allGalleryImages.value.map(i => i.assetId)) + } +} + +const downloadSelected = async () => { + const ids = [...selectedAssetIds.value] + if (ids.length === 0) return + isDownloading.value = true + try { + const user = JSON.parse(localStorage.getItem('user')) + const headers = {} + if (user && user.access_token) headers['Authorization'] = `Bearer ${user.access_token}` + else if (user && user.token) headers['Authorization'] = `${user.tokenType} ${user.token}` + const projectId = localStorage.getItem('active_project_id') + if (projectId) headers['X-Project-ID'] = projectId + + for (const assetId of ids) { + const url = API_URL + '/assets/' + assetId + const resp = await fetch(url, { headers }) + const blob = await resp.blob() + const a = document.createElement('a') + a.href = URL.createObjectURL(blob) + a.download = assetId + '.png' + document.body.appendChild(a) + a.click() + document.body.removeChild(a) + URL.revokeObjectURL(a.href) + } + toast.add({ severity: 'success', summary: 'Downloaded', detail: `${ids.length} image(s) saved`, life: 2000 }) + } catch (e) { + console.error('Download failed', e) + toast.add({ severity: 'error', summary: 'Error', detail: 'Download failed', life: 3000 }) + } finally { + isDownloading.value = false + } +} + +// Exit select mode when switching to feed +watch(viewMode, (v) => { + if (v !== 'gallery') { + isSelectMode.value = false + selectedAssetIds.value = new Set() + } +}) +