From 55e8db92ed7dadbb850aa63f6d14b60b2ea84478 Mon Sep 17 00:00:00 2001 From: xds Date: Sun, 15 Feb 2026 12:26:14 +0300 Subject: [PATCH 1/2] 123 --- src/components/AppSidebar.vue | 1 + src/router/index.js | 10 + src/services/ideaService.js | 12 + src/stores/ideas.js | 161 ++++++ src/views/FlexibleGenerationView.vue | 11 +- src/views/IdeaDetailView.vue | 770 +++++++++++++++++++++++++++ src/views/IdeasView.vue | 163 ++++++ 7 files changed, 1125 insertions(+), 3 deletions(-) create mode 100644 src/services/ideaService.js create mode 100644 src/stores/ideas.js create mode 100644 src/views/IdeaDetailView.vue create mode 100644 src/views/IdeasView.vue diff --git a/src/components/AppSidebar.vue b/src/components/AppSidebar.vue index f452e93..26b651b 100644 --- a/src/components/AppSidebar.vue +++ b/src/components/AppSidebar.vue @@ -72,6 +72,7 @@ const navItems = computed(() => { const items = [ { path: '/', icon: '🏠', tooltip: 'Home' }, { path: '/projects', icon: '📂', tooltip: 'Projects' }, + { path: '/ideas', icon: '💡', tooltip: 'Ideas' }, { path: '/flexible', icon: '🖌️', tooltip: 'Flexible' }, { path: '/albums', icon: '🖼️', tooltip: 'Library' }, { path: '/characters', icon: '👥', tooltip: 'Characters' } diff --git a/src/router/index.js b/src/router/index.js index 5f21804..1b6d3c4 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -62,6 +62,16 @@ const router = createRouter({ name: 'albums', component: () => import('../views/AlbumsView.vue') }, + { + path: '/ideas', + name: 'ideas', + component: () => import('../views/IdeasView.vue') + }, + { + path: '/ideas/:id', + name: 'idea-detail', + component: () => import('../views/IdeaDetailView.vue') + }, { path: '/projects', name: 'projects', diff --git a/src/services/ideaService.js b/src/services/ideaService.js new file mode 100644 index 0000000..f036c15 --- /dev/null +++ b/src/services/ideaService.js @@ -0,0 +1,12 @@ +import api from './api'; + +export const ideaService = { + getIdeas: (limit = 10, offset = 0) => api.get('/ideas', { params: { limit, offset } }), + createIdea: (data) => api.post('/ideas', data), + getIdea: (id) => api.get(`/ideas/${id}`), + updateIdea: (id, data) => api.put(`/ideas/${id}`, data), + deleteIdea: (id) => api.delete(`/ideas/${id}`), + addGenerationToIdea: (ideaId, generationId) => api.post(`/ideas/${ideaId}/generations/${generationId}`), + removeGenerationFromIdea: (ideaId, generationId) => api.delete(`/ideas/${ideaId}/generations/${generationId}`), + getIdeaGenerations: (ideaId, limit = 10, offset = 0) => api.get(`/ideas/${ideaId}/generations`, { params: { limit, offset } }) +}; diff --git a/src/stores/ideas.js b/src/stores/ideas.js new file mode 100644 index 0000000..fb74b4b --- /dev/null +++ b/src/stores/ideas.js @@ -0,0 +1,161 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; +import { ideaService } from '../services/ideaService'; + +export const useIdeaStore = defineStore('ideas', () => { + const ideas = ref([]); + const currentIdea = ref(null); + const loading = ref(false); + const error = ref(null); + const totalIdeas = ref(0); + + async function fetchIdeas(limit = 10, offset = 0) { + loading.value = true; + error.value = null; + try { + const response = await ideaService.getIdeas(limit, offset); + if (response.data.ideas) { + ideas.value = response.data.ideas; + totalIdeas.value = response.data.total_count; + } else { + ideas.value = response.data; + } + } catch (err) { + console.error('Error fetching ideas:', err); + error.value = err.response?.data?.detail || 'Failed to fetch ideas'; + } finally { + loading.value = false; + } + } + + async function createIdea(data) { + loading.value = true; + error.value = null; + try { + await ideaService.createIdea(data); + await fetchIdeas(); // Refresh list + return true; + } catch (err) { + console.error('Error creating idea:', err); + error.value = err.response?.data?.detail || 'Failed to create idea'; + return false; + } finally { + loading.value = false; + } + } + + async function fetchIdea(id) { + loading.value = true; + error.value = null; + currentIdea.value = null; + try { + const response = await ideaService.getIdea(id); + currentIdea.value = response.data; + return response.data; + } catch (err) { + console.error('Error fetching idea:', err); + error.value = err.response?.data?.detail || 'Failed to fetch idea'; + return null; + } finally { + loading.value = false; + } + } + + async function updateIdea(id, data) { + loading.value = true; + error.value = null; + try { + await ideaService.updateIdea(id, data); + if (currentIdea.value && currentIdea.value.id === id) { + await fetchIdea(id); + } + await fetchIdeas(); + return true; + } catch (err) { + console.error('Error updating idea:', err); + error.value = err.response?.data?.detail || 'Failed to update idea'; + return false; + } finally { + loading.value = false; + } + } + + async function deleteIdea(id) { + loading.value = true; + error.value = null; + try { + await ideaService.deleteIdea(id); + await fetchIdeas(); // Refresh list + return true; + } catch (err) { + console.error('Error deleting idea:', err); + error.value = err.response?.data?.detail || 'Failed to delete idea'; + return false; + } finally { + loading.value = false; + } + } + + async function addGenerationToIdea(ideaId, generationId) { + loading.value = true; + error.value = null; + try { + await ideaService.addGenerationToIdea(ideaId, generationId); + if (currentIdea.value && currentIdea.value.id === ideaId) { + await fetchIdea(ideaId); + } + return true; + } catch (err) { + console.error('Error adding generation to idea:', err); + error.value = err.response?.data?.detail || 'Failed to add generation to idea'; + return false; + } finally { + loading.value = false; + } + } + + async function removeGenerationFromIdea(ideaId, generationId) { + loading.value = true; + error.value = null; + try { + await ideaService.removeGenerationFromIdea(ideaId, generationId); + if (currentIdea.value && currentIdea.value.id === ideaId) { + await fetchIdea(ideaId); + } + return true; + } catch (err) { + console.error('Error removing generation from idea:', err); + error.value = err.response?.data?.detail || 'Failed to remove generation from idea'; + return false; + } finally { + loading.value = false; + } + } + + // Assuming getIdeaGenerations is separate from getIdea + async function fetchIdeaGenerations(ideaId, limit = 100, offset = 0) { + try { + const response = await ideaService.getIdeaGenerations(ideaId, limit, offset); + return response; + } catch (err) { + console.error('Error fetching idea generations:', err); + return { data: [] }; + } + } + + return { + ideas, + currentIdea, + loading, + error, + totalIdeas, + fetchIdeas, + createIdea, + fetchIdea, + updateIdea, + deleteIdea, + addGenerationToIdea, + removeGenerationFromIdea, + fetchIdeaGenerations + }; +}); diff --git a/src/views/FlexibleGenerationView.vue b/src/views/FlexibleGenerationView.vue index db3928a..36a8add 100644 --- a/src/views/FlexibleGenerationView.vue +++ b/src/views/FlexibleGenerationView.vue @@ -892,7 +892,7 @@ const confirmAddToAlbum = async () => { {{ item.status - }}... + }}... {{ item.progress }}% @@ -956,7 +956,7 @@ const confirmAddToAlbum = async () => { @click.stop="reuseAsset(item)" />

{{ item.prompt - }}

+ }}

@@ -1045,7 +1045,12 @@ const confirmAddToAlbum = async () => {
- +