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"
)