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:
@@ -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
9
frontend/src/features.js
Normal 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
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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,6 +52,7 @@ 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)
|
||||||
|
if FEATURE_IA:
|
||||||
app.include_router(ia_router)
|
app.include_router(ia_router)
|
||||||
app.include_router(config_router)
|
app.include_router(config_router)
|
||||||
|
|
||||||
|
|||||||
10
src/plesna_gerance/features.py
Normal file
10
src/plesna_gerance/features.py
Normal 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
|
||||||
Reference in New Issue
Block a user