Update interface_wizard.py
Browse files- interface_wizard.py +27 -41
interface_wizard.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
"""
|
2 |
Module définissant l'interface utilisateur Gradio sous forme d'assistant progressif (wizard).
|
3 |
-
|
4 |
"""
|
5 |
import gradio as gr
|
6 |
from utils import collect_author_info, ensure_default_supports
|
@@ -24,7 +24,7 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
24 |
# Définir le nombre total d'étapes
|
25 |
TOTAL_STEPS = 6
|
26 |
|
27 |
-
with gr.Blocks(title="Assistant de Contrats de Cession", css="
|
28 |
# Variables d'état pour stocker les données entre les étapes
|
29 |
current_step = gr.State(value=1)
|
30 |
contract_data = gr.State(value={
|
@@ -278,26 +278,30 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
278 |
value=""
|
279 |
)
|
280 |
|
|
|
|
|
281 |
# Indicateur de génération
|
282 |
-
with gr.Group(
|
283 |
-
generation_status = gr.Markdown("
|
284 |
generation_progress = gr.Slider(
|
285 |
minimum=0,
|
286 |
maximum=100,
|
287 |
value=0,
|
288 |
step=1,
|
289 |
interactive=False,
|
290 |
-
label="Progression"
|
|
|
291 |
)
|
|
|
|
|
|
|
|
|
|
|
292 |
|
293 |
# Boutons de navigation entre les étapes
|
294 |
with gr.Row():
|
295 |
back_button = gr.Button("Précédent", variant="secondary")
|
296 |
next_button = gr.Button("Suivant", variant="primary")
|
297 |
-
|
298 |
-
# Bouton de génération (visible uniquement à la dernière étape)
|
299 |
-
with gr.Row(visible=False) as generate_button_row:
|
300 |
-
generate_button = gr.Button("Générer le PDF", variant="primary", elem_id="generate-btn")
|
301 |
|
302 |
# COLONNE DROITE - PRÉVISUALISATION EN TEMPS RÉEL
|
303 |
with gr.Column(scale=2):
|
@@ -307,16 +311,11 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
307 |
"Au fur et à mesure que vous remplissez le formulaire, votre contrat se construit ici."
|
308 |
)
|
309 |
|
310 |
-
# Prévisualisation du contrat
|
311 |
-
contract_preview = gr.
|
312 |
-
value="
|
313 |
elem_id="contract-preview"
|
314 |
)
|
315 |
-
|
316 |
-
# Zone de téléchargement (visible uniquement après génération)
|
317 |
-
with gr.Group(visible=False) as download_group:
|
318 |
-
gr.Markdown("### Téléchargement")
|
319 |
-
pdf_output = gr.File(label="Votre contrat est prêt!")
|
320 |
|
321 |
# ===== FONCTIONS DE NAVIGATION ET MISE À JOUR =====
|
322 |
|
@@ -442,9 +441,6 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
442 |
show_physical_person = (current == 3 and author_type_val == "Personne physique")
|
443 |
show_legal_entity = (current == 3 and author_type_val == "Personne morale")
|
444 |
|
445 |
-
# Visibilité du bouton de génération (uniquement à la dernière étape)
|
446 |
-
show_generate_button = (current == TOTAL_STEPS)
|
447 |
-
|
448 |
# Mettre à jour l'aperçu du contrat
|
449 |
preview = preview_contract(data)
|
450 |
|
@@ -464,7 +460,6 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
464 |
gr.update(visible=rights_visibility), gr.update(visible=remuneration_visibility),
|
465 |
gr.update(visible=show_work_desc), gr.update(visible=show_image_desc),
|
466 |
gr.update(visible=show_physical_person), gr.update(visible=show_legal_entity),
|
467 |
-
gr.update(visible=show_generate_button),
|
468 |
# Aperçu du contrat
|
469 |
preview
|
470 |
)
|
@@ -502,9 +497,6 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
502 |
show_physical_person = (current == 3 and data["auteur_type"] == "Personne physique")
|
503 |
show_legal_entity = (current == 3 and data["auteur_type"] == "Personne morale")
|
504 |
|
505 |
-
# Visibilité du bouton de génération (uniquement à la dernière étape)
|
506 |
-
show_generate_button = (current == TOTAL_STEPS)
|
507 |
-
|
508 |
# Mettre à jour l'aperçu du contrat
|
509 |
preview = preview_contract(data)
|
510 |
|
@@ -524,7 +516,6 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
524 |
gr.update(visible=rights_visibility), gr.update(visible=remuneration_visibility),
|
525 |
gr.update(visible=show_work_desc), gr.update(visible=show_image_desc),
|
526 |
gr.update(visible=show_physical_person), gr.update(visible=show_legal_entity),
|
527 |
-
gr.update(visible=show_generate_button),
|
528 |
# Aperçu du contrat
|
529 |
preview
|
530 |
)
|
@@ -545,20 +536,16 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
545 |
def generate_pdf(contract_data, filename):
|
546 |
"""Génère le PDF du contrat avec indication de progression."""
|
547 |
|
548 |
-
# Mise à jour de l'interface pour indiquer le début de la génération
|
549 |
-
yield gr.update(visible=True), gr.update(value="Préparation des données..."), 0, gr.update(visible=False), None
|
550 |
-
time.sleep(0.5)
|
551 |
-
|
552 |
# Étape 1: Préparation du contrat (25%)
|
553 |
-
yield gr.update(
|
554 |
time.sleep(0.5)
|
555 |
|
556 |
# Étape 2: Mise en forme (50%)
|
557 |
-
yield gr.update(
|
558 |
time.sleep(0.5)
|
559 |
|
560 |
# Étape 3: Génération du PDF (75%)
|
561 |
-
yield gr.update(
|
562 |
|
563 |
# Appel à la fonction de génération réelle
|
564 |
pdf_path = generate_pdf_fn(
|
@@ -575,7 +562,7 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
575 |
)
|
576 |
|
577 |
# Finalisation (100%)
|
578 |
-
yield gr.update(
|
579 |
|
580 |
# Fonction simplifiée pour prévisualiser le contrat
|
581 |
def preview_contract(data):
|
@@ -583,7 +570,7 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
583 |
|
584 |
# Vérifier qu'il y a suffisamment de données pour prévisualiser
|
585 |
if not data.get("type_contrat"):
|
586 |
-
return "
|
587 |
|
588 |
# Appeler la fonction de prévisualisation
|
589 |
try:
|
@@ -608,9 +595,10 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
608 |
if ligne.strip().startswith("ARTICLE") or ligne.strip().isupper():
|
609 |
preview_html = preview_html.replace(ligne, f"<h3>{ligne}</h3>")
|
610 |
|
611 |
-
|
|
|
612 |
except Exception as e:
|
613 |
-
return f"
|
614 |
|
615 |
# ===== ÉVÉNEMENTS =====
|
616 |
|
@@ -642,7 +630,6 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
642 |
group_rights, group_remuneration,
|
643 |
group_work_description, group_image_description,
|
644 |
group_physical_person, group_legal_entity,
|
645 |
-
generate_button_row,
|
646 |
# Aperçu du contrat
|
647 |
contract_preview
|
648 |
]
|
@@ -661,7 +648,6 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
661 |
group_rights, group_remuneration,
|
662 |
group_work_description, group_image_description,
|
663 |
group_physical_person, group_legal_entity,
|
664 |
-
generate_button_row,
|
665 |
# Aperçu du contrat
|
666 |
contract_preview
|
667 |
]
|
@@ -685,9 +671,9 @@ def create_wizard_interface(generate_pdf_fn, preview_contract_fn):
|
|
685 |
fn=generate_pdf,
|
686 |
inputs=[contract_data, contract_name],
|
687 |
outputs=[
|
688 |
-
|
689 |
-
|
690 |
]
|
691 |
)
|
692 |
|
693 |
-
return demo
|
|
|
1 |
"""
|
2 |
Module définissant l'interface utilisateur Gradio sous forme d'assistant progressif (wizard).
|
3 |
+
Version améliorée avec zone de prévisualisation fixe et meilleur placement des éléments.
|
4 |
"""
|
5 |
import gradio as gr
|
6 |
from utils import collect_author_info, ensure_default_supports
|
|
|
24 |
# Définir le nombre total d'étapes
|
25 |
TOTAL_STEPS = 6
|
26 |
|
27 |
+
with gr.Blocks(title="Assistant de Contrats de Cession", css="wizard_style.css") as demo:
|
28 |
# Variables d'état pour stocker les données entre les étapes
|
29 |
current_step = gr.State(value=1)
|
30 |
contract_data = gr.State(value={
|
|
|
278 |
value=""
|
279 |
)
|
280 |
|
281 |
+
generate_button = gr.Button("Générer le PDF", variant="primary", elem_id="generate-btn")
|
282 |
+
|
283 |
# Indicateur de génération
|
284 |
+
with gr.Group() as generation_status_group:
|
285 |
+
generation_status = gr.Markdown("", elem_id="generation-status")
|
286 |
generation_progress = gr.Slider(
|
287 |
minimum=0,
|
288 |
maximum=100,
|
289 |
value=0,
|
290 |
step=1,
|
291 |
interactive=False,
|
292 |
+
label="Progression",
|
293 |
+
visible=False
|
294 |
)
|
295 |
+
|
296 |
+
# Zone de téléchargement (maintenant placée sous le bouton)
|
297 |
+
with gr.Group(visible=False) as download_group:
|
298 |
+
gr.Markdown("### Téléchargement")
|
299 |
+
pdf_output = gr.File(label="Votre contrat est prêt!")
|
300 |
|
301 |
# Boutons de navigation entre les étapes
|
302 |
with gr.Row():
|
303 |
back_button = gr.Button("Précédent", variant="secondary")
|
304 |
next_button = gr.Button("Suivant", variant="primary")
|
|
|
|
|
|
|
|
|
305 |
|
306 |
# COLONNE DROITE - PRÉVISUALISATION EN TEMPS RÉEL
|
307 |
with gr.Column(scale=2):
|
|
|
311 |
"Au fur et à mesure que vous remplissez le formulaire, votre contrat se construit ici."
|
312 |
)
|
313 |
|
314 |
+
# Prévisualisation du contrat - avec classe spéciale pour avoir une hauteur fixe
|
315 |
+
contract_preview = gr.HTML(
|
316 |
+
value="<div class='fixed-preview'>*Commencez à remplir le formulaire pour voir l'aperçu du contrat*</div>",
|
317 |
elem_id="contract-preview"
|
318 |
)
|
|
|
|
|
|
|
|
|
|
|
319 |
|
320 |
# ===== FONCTIONS DE NAVIGATION ET MISE À JOUR =====
|
321 |
|
|
|
441 |
show_physical_person = (current == 3 and author_type_val == "Personne physique")
|
442 |
show_legal_entity = (current == 3 and author_type_val == "Personne morale")
|
443 |
|
|
|
|
|
|
|
444 |
# Mettre à jour l'aperçu du contrat
|
445 |
preview = preview_contract(data)
|
446 |
|
|
|
460 |
gr.update(visible=rights_visibility), gr.update(visible=remuneration_visibility),
|
461 |
gr.update(visible=show_work_desc), gr.update(visible=show_image_desc),
|
462 |
gr.update(visible=show_physical_person), gr.update(visible=show_legal_entity),
|
|
|
463 |
# Aperçu du contrat
|
464 |
preview
|
465 |
)
|
|
|
497 |
show_physical_person = (current == 3 and data["auteur_type"] == "Personne physique")
|
498 |
show_legal_entity = (current == 3 and data["auteur_type"] == "Personne morale")
|
499 |
|
|
|
|
|
|
|
500 |
# Mettre à jour l'aperçu du contrat
|
501 |
preview = preview_contract(data)
|
502 |
|
|
|
516 |
gr.update(visible=rights_visibility), gr.update(visible=remuneration_visibility),
|
517 |
gr.update(visible=show_work_desc), gr.update(visible=show_image_desc),
|
518 |
gr.update(visible=show_physical_person), gr.update(visible=show_legal_entity),
|
|
|
519 |
# Aperçu du contrat
|
520 |
preview
|
521 |
)
|
|
|
536 |
def generate_pdf(contract_data, filename):
|
537 |
"""Génère le PDF du contrat avec indication de progression."""
|
538 |
|
|
|
|
|
|
|
|
|
539 |
# Étape 1: Préparation du contrat (25%)
|
540 |
+
yield gr.update(value="Préparation des données..."), gr.update(visible=True, value=25), gr.update(visible=False), None
|
541 |
time.sleep(0.5)
|
542 |
|
543 |
# Étape 2: Mise en forme (50%)
|
544 |
+
yield gr.update(value="Construction du contrat..."), gr.update(visible=True, value=50), gr.update(visible=False), None
|
545 |
time.sleep(0.5)
|
546 |
|
547 |
# Étape 3: Génération du PDF (75%)
|
548 |
+
yield gr.update(value="Génération du PDF..."), gr.update(visible=True, value=75), gr.update(visible=False), None
|
549 |
|
550 |
# Appel à la fonction de génération réelle
|
551 |
pdf_path = generate_pdf_fn(
|
|
|
562 |
)
|
563 |
|
564 |
# Finalisation (100%)
|
565 |
+
yield gr.update(value="Contrat PDF généré avec succès!"), gr.update(visible=True, value=100), gr.update(visible=True), pdf_path
|
566 |
|
567 |
# Fonction simplifiée pour prévisualiser le contrat
|
568 |
def preview_contract(data):
|
|
|
570 |
|
571 |
# Vérifier qu'il y a suffisamment de données pour prévisualiser
|
572 |
if not data.get("type_contrat"):
|
573 |
+
return "<div class='fixed-preview'>*Complétez au moins le type de contrat pour voir l'aperçu*</div>"
|
574 |
|
575 |
# Appeler la fonction de prévisualisation
|
576 |
try:
|
|
|
595 |
if ligne.strip().startswith("ARTICLE") or ligne.strip().isupper():
|
596 |
preview_html = preview_html.replace(ligne, f"<h3>{ligne}</h3>")
|
597 |
|
598 |
+
# Encapsuler le contenu dans une div avec la classe spéciale
|
599 |
+
return f"<div class='fixed-preview'>{preview_html}</div>"
|
600 |
except Exception as e:
|
601 |
+
return f"<div class='fixed-preview'>*Erreur de prévisualisation: {str(e)}*</div>"
|
602 |
|
603 |
# ===== ÉVÉNEMENTS =====
|
604 |
|
|
|
630 |
group_rights, group_remuneration,
|
631 |
group_work_description, group_image_description,
|
632 |
group_physical_person, group_legal_entity,
|
|
|
633 |
# Aperçu du contrat
|
634 |
contract_preview
|
635 |
]
|
|
|
648 |
group_rights, group_remuneration,
|
649 |
group_work_description, group_image_description,
|
650 |
group_physical_person, group_legal_entity,
|
|
|
651 |
# Aperçu du contrat
|
652 |
contract_preview
|
653 |
]
|
|
|
671 |
fn=generate_pdf,
|
672 |
inputs=[contract_data, contract_name],
|
673 |
outputs=[
|
674 |
+
generation_status, generation_progress,
|
675 |
+
download_group, pdf_output
|
676 |
]
|
677 |
)
|
678 |
|
679 |
+
return demo
|