46 lines
1.7 KiB
Python
46 lines
1.7 KiB
Python
import streamlit as st
|
|
import db
|
|
|
|
def label_widget(video_name, preselected=None):
|
|
"""Widget multiselect labels avec création dynamique et réactivité."""
|
|
preselected = preselected or []
|
|
|
|
key_multiselect = f"labels_{video_name}"
|
|
key_input = f"new_label_{video_name}"
|
|
|
|
# --- Charger labels depuis DB ---
|
|
labels = db.load_labels()
|
|
|
|
# --- Initialisation session_state ---
|
|
if key_multiselect not in st.session_state:
|
|
st.session_state[key_multiselect] = preselected
|
|
|
|
# --- Si "Autre…" dans sélection, afficher input ---
|
|
current_selected = st.session_state[key_multiselect]
|
|
if "Autre…" in current_selected:
|
|
new_label = st.text_input("Entrer un label personnalisé", value="", key=key_input)
|
|
if new_label.strip():
|
|
# Ajouter le nouveau label à la DB
|
|
db.create_labels([new_label.strip()])
|
|
# Mettre à jour options avant de créer le multiselect
|
|
labels = db.load_labels()
|
|
# Remplacer "Autre…" par le nouveau label dans selection
|
|
current_selected = [l for l in current_selected if l != "Autre…"] + [new_label.strip()]
|
|
# MAINTENANT c'est sûr de passer current_selected comme default
|
|
st.session_state[key_multiselect] = current_selected
|
|
|
|
# --- Multiselect ---
|
|
selected = st.multiselect(
|
|
"Labels",
|
|
options=labels + ["Autre…"],
|
|
default=st.session_state[key_multiselect],
|
|
key=key_multiselect
|
|
)
|
|
|
|
# --- Sauvegarde ---
|
|
if st.button("💾 Sauvegarder labels", key=f"save_{video_name}"):
|
|
db.save_video_labels(video_name, selected)
|
|
st.success(f"{len(selected)} label(s) enregistré(s) pour {video_name}")
|
|
|
|
return selected
|