From 55e8db92ed7dadbb850aa63f6d14b60b2ea84478 Mon Sep 17 00:00:00 2001
From: xds
Date: Sun, 15 Feb 2026 12:26:14 +0300
Subject: [PATCH] 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 () => {
-
+