import dash from dash import html, dcc, callback, Input, Output import dash_mantine_components as dmc from dash_iconify import DashIconify dash.register_page(__name__, path='/rac-generation-agent', name='Génération du RAC') tasks = [ "Récupération des offres d'emploi", "Récupération des statistiques de l'emploi", "Récupération de la fiche métier", "Génération de la cotation du secteur", ] def create_stepper_step(step_id, label): return dmc.Group( [ dmc.Box(id=f"icon-{step_id}", children=DashIconify(icon="radix-icons:dot", width=20)), dmc.Text(label), ], mb="sm", ) layout = dmc.Container( [ html.Script( """ document.addEventListener('DOMContentLoaded', function() { const socket = io.connect(window.location.protocol + '//' + document.domain + ':' + location.port); const startButton = document.getElementById('start-rac-button'); const taskIcons = { 'Récupération des offres d'emploi': 'icon-step-0', 'Récupération des statistiques de l'emploi': 'icon-step-1', 'Récupération de la fiche métier': 'icon-step-2', 'Génération de la cotation du secteur': 'icon-step-3', }; const streamingOutputs = { 'Récupération des offres d'emploi': 'streaming-output-0', 'Récupération des statistiques de l'emploi': 'streaming-output-1', 'Récupération de la fiche métier': 'streaming-output-2', 'Génération de la cotation du secteur': 'streaming-output-3', }; let currentStep = ''; socket.on('stream', function(msg) { if (msg.step !== currentStep) { if(currentStep) { const oldIcon = document.getElementById(taskIcons[currentStep]); oldIcon.innerHTML = ''; // Checkmark icon } currentStep = msg.step; const icon = document.getElementById(taskIcons[currentStep]); icon.innerHTML = ''; } const output = document.getElementById(streamingOutputs[msg.step]); output.innerHTML += msg.data; }); socket.on('stream_end', function(msg) { if(msg.step === "Génération de la cotation du secteur") { const icon = document.getElementById(taskIcons[msg.step]); icon.innerHTML = ''; } }); startButton.addEventListener('click', function() { fetch('/start_rac_agent', {method: 'POST'}) .then(response => response.json()) .then(data => console.log(data.status)); }); }); """ ), dmc.Title("Génération du Référentiel d'Activités et de Compétences (RAC)", order=2, mb="lg"), dmc.Button("Démarrer la génération", id="start-rac-button", mb="lg"), dmc.Grid( [ dmc.GridCol( [ dmc.Title("Statut des tâches", order=4, mb="md"), *[create_stepper_step(f"step-{i}", task) for i, task in enumerate(tasks)] ], span=4 ), dmc.GridCol( [ dmc.Title("Contenu généré", order=4, mb="md"), *[dmc.Paper( shadow="xs", p="md", withBorder=True, mb="sm", id=f"streaming-output-{i}", style={"whiteSpace": "pre-line", "fontFamily": "monospace"} ) for i, task in enumerate(tasks)] ], span=8 ), ] ) ], fluid=True, p="lg", pt="xl" )