feat: masque la section IA derriere un interrupteur de fonctionnalite

La section IA n'est pas prete a etre utilisee. Plutot que de supprimer le
code, deux interrupteurs alignes la retirent de l'application :

- frontend/src/features.js : onglet de navigation, page /ia (redirigee vers
  l'accueil pour ne pas casser un signet) et section « Configuration LLM »
  de la page Config. La page n'est plus embarquee dans le bundle.
- src/plesna_gerance/features.py : les routes /api/ia ne sont plus montees,
  les endpoints n'existent donc pas du tout.

Les settings Ollama restent en base : repasser les deux interrupteurs a
true suffit a tout reactiver, sans ressaisie.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-26 12:14:27 +02:00
parent 11bd3ca539
commit eb7eead555
6 changed files with 46 additions and 12 deletions

View File

@@ -46,6 +46,7 @@
import { ref } from 'vue' import { ref } from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { pendingFile } from './store' import { pendingFile } from './store'
import { FEATURE_IA } from './features'
const router = useRouter() const router = useRouter()
const fileInput = ref(null) const fileInput = ref(null)
@@ -55,7 +56,7 @@ const navLinks = [
{ to: '/documents', label: 'Documents' }, { to: '/documents', label: 'Documents' },
{ to: '/revenus', label: 'Revenus' }, { to: '/revenus', label: 'Revenus' },
{ to: '/analytics', label: 'Depenses' }, { to: '/analytics', label: 'Depenses' },
{ to: '/ia', label: 'IA' }, ...(FEATURE_IA ? [{ to: '/ia', label: 'IA' }] : []),
{ to: '/config', label: 'Config' } { to: '/config', label: 'Config' }
] ]

9
frontend/src/features.js Normal file
View File

@@ -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

View File

@@ -5,15 +5,15 @@
<div class="page-header"> <div class="page-header">
<div> <div>
<h1 class="page-title">Configuration</h1> <h1 class="page-title">Configuration</h1>
<p class="page-subtitle">Paramètres LLM et gestion des tags</p> <p class="page-subtitle">{{ FEATURE_IA ? 'Paramètres LLM et gestion des tags' : 'Gestion des tags' }}</p>
</div> </div>
</div> </div>
<!-- Les deux sections cote a cote des que la largeur le permet --> <!-- Les deux sections cote a cote des que la largeur le permet -->
<div class="grid grid-cols-1 xl:grid-cols-2 gap-6 items-start"> <div class="grid grid-cols-1 gap-6 items-start" :class="{ 'xl:grid-cols-2': FEATURE_IA }">
<!-- Section LLM --> <!-- Section LLM -->
<div class="card"> <div v-if="FEATURE_IA" class="card">
<div class="card-header"> <div class="card-header">
<h2 class="card-title">Configuration LLM (Ollama)</h2> <h2 class="card-title">Configuration LLM (Ollama)</h2>
</div> </div>
@@ -130,6 +130,7 @@
<script setup> <script setup>
import { ref, onMounted, nextTick } from 'vue' import { ref, onMounted, nextTick } from 'vue'
import { FEATURE_IA } from '../features'
const API = import.meta.env.VITE_API_URL || '' const API = import.meta.env.VITE_API_URL || ''
@@ -300,7 +301,8 @@ async function createTag() {
// ============================================================ // ============================================================
onMounted(() => { onMounted(() => {
loadSettings() // Les settings ne servent qu'à la section LLM, masquée avec la section IA.
if (FEATURE_IA) loadSettings()
loadTags() loadTags()
}) })
</script> </script>

View File

@@ -6,8 +6,22 @@ import RevenusPage from './pages/RevenusPage.vue'
import DocumentsPage from './pages/DocumentsPage.vue' import DocumentsPage from './pages/DocumentsPage.vue'
import EditDocumentPage from './pages/EditDocumentPage.vue' import EditDocumentPage from './pages/EditDocumentPage.vue'
import ReExtractionPage from './pages/ReExtractionPage.vue' import ReExtractionPage from './pages/ReExtractionPage.vue'
import IAPage from './pages/IAPage.vue'
import ConfigPage from './pages/ConfigPage.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 = [ const routes = [
{ {
@@ -30,11 +44,7 @@ const routes = [
name: 'revenus', name: 'revenus',
component: RevenusPage component: RevenusPage
}, },
{ iaRoute,
path: '/ia',
name: 'ia',
component: IAPage
},
{ {
path: '/config', path: '/config',
name: 'config', name: 'config',

View File

@@ -9,6 +9,7 @@ from fastapi.staticfiles import StaticFiles
from .. import __version__ from .. import __version__
from ..database import init_db from ..database import init_db
from ..features import FEATURE_IA
from ..paths import resource_path from ..paths import resource_path
from .routes import ( from .routes import (
analytics_router, analytics_router,
@@ -51,7 +52,8 @@ app.include_router(tags_router)
app.include_router(analytics_router) app.include_router(analytics_router)
app.include_router(dashboard_router) app.include_router(dashboard_router)
app.include_router(revenus_router) app.include_router(revenus_router)
app.include_router(ia_router) if FEATURE_IA:
app.include_router(ia_router)
app.include_router(config_router) app.include_router(config_router)

View File

@@ -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