diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 24921c1..072147a 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -46,6 +46,7 @@ import { ref } from 'vue' import { useRouter } from 'vue-router' import { pendingFile } from './store' +import { FEATURE_IA } from './features' const router = useRouter() const fileInput = ref(null) @@ -55,7 +56,7 @@ const navLinks = [ { to: '/documents', label: 'Documents' }, { to: '/revenus', label: 'Revenus' }, { to: '/analytics', label: 'Depenses' }, - { to: '/ia', label: 'IA' }, + ...(FEATURE_IA ? [{ to: '/ia', label: 'IA' }] : []), { to: '/config', label: 'Config' } ] diff --git a/frontend/src/features.js b/frontend/src/features.js new file mode 100644 index 0000000..a5c4bc7 --- /dev/null +++ b/frontend/src/features.js @@ -0,0 +1,9 @@ +// Interrupteurs de fonctionnalités du front. +// +// FEATURE_IA masque toute la section IA (onglet de navigation, page /ia, +// section « Configuration LLM » de la page Config) en attendant qu'elle soit +// prête. Le code reste en place : repasser à `true` la réactive partout. +// +// Le backend a son propre interrupteur dans src/plesna_gerance/features.py +// (il monte ou non les routes /api/ia) : les deux doivent rester alignés. +export const FEATURE_IA = false diff --git a/frontend/src/pages/ConfigPage.vue b/frontend/src/pages/ConfigPage.vue index 8bbc820..0046d04 100644 --- a/frontend/src/pages/ConfigPage.vue +++ b/frontend/src/pages/ConfigPage.vue @@ -5,15 +5,15 @@ -
+
-
+

Configuration LLM (Ollama)

@@ -130,6 +130,7 @@ diff --git a/frontend/src/router.js b/frontend/src/router.js index 45ed659..cbbb962 100644 --- a/frontend/src/router.js +++ b/frontend/src/router.js @@ -6,8 +6,22 @@ import RevenusPage from './pages/RevenusPage.vue' import DocumentsPage from './pages/DocumentsPage.vue' import EditDocumentPage from './pages/EditDocumentPage.vue' import ReExtractionPage from './pages/ReExtractionPage.vue' -import IAPage from './pages/IAPage.vue' import ConfigPage from './pages/ConfigPage.vue' +import { FEATURE_IA } from './features' + +// Section IA masquée : /ia reste une route valide mais ramène à l'accueil, pour +// qu'un signet ou une entrée d'historique n'aboutisse pas sur une page vide. +// La page n'est chargée (et embarquée dans le bundle) que si la feature est active. +const iaRoute = FEATURE_IA + ? { + path: '/ia', + name: 'ia', + component: () => import('./pages/IAPage.vue') + } + : { + path: '/ia', + redirect: '/' + } const routes = [ { @@ -30,11 +44,7 @@ const routes = [ name: 'revenus', component: RevenusPage }, - { - path: '/ia', - name: 'ia', - component: IAPage - }, + iaRoute, { path: '/config', name: 'config', diff --git a/src/plesna_gerance/api/app.py b/src/plesna_gerance/api/app.py index 477122f..27b048c 100644 --- a/src/plesna_gerance/api/app.py +++ b/src/plesna_gerance/api/app.py @@ -9,6 +9,7 @@ from fastapi.staticfiles import StaticFiles from .. import __version__ from ..database import init_db +from ..features import FEATURE_IA from ..paths import resource_path from .routes import ( analytics_router, @@ -51,7 +52,8 @@ app.include_router(tags_router) app.include_router(analytics_router) app.include_router(dashboard_router) app.include_router(revenus_router) -app.include_router(ia_router) +if FEATURE_IA: + app.include_router(ia_router) app.include_router(config_router) diff --git a/src/plesna_gerance/features.py b/src/plesna_gerance/features.py new file mode 100644 index 0000000..c89f5f5 --- /dev/null +++ b/src/plesna_gerance/features.py @@ -0,0 +1,10 @@ +"""Interrupteurs de fonctionnalités du backend. + +FEATURE_IA conditionne le montage des routes /api/ia. Désactivé, les endpoints +n'existent pas du tout : le code reste en place, il n'est simplement pas exposé. + +Le front a son propre interrupteur dans frontend/src/features.js (onglet, page +et section Config) : les deux doivent rester alignés. +""" + +FEATURE_IA = False