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 { 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' }
]

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>
<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>
<!-- 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 -->
<div class="card">
<div v-if="FEATURE_IA" class="card">
<div class="card-header">
<h2 class="card-title">Configuration LLM (Ollama)</h2>
</div>
@@ -130,6 +130,7 @@
<script setup>
import { ref, onMounted, nextTick } from 'vue'
import { FEATURE_IA } from '../features'
const API = import.meta.env.VITE_API_URL || ''
@@ -300,7 +301,8 @@ async function createTag() {
// ============================================================
onMounted(() => {
loadSettings()
// Les settings ne servent qu'à la section LLM, masquée avec la section IA.
if (FEATURE_IA) loadSettings()
loadTags()
})
</script>

View File

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