import streamlit as st import pandas as pd import os import time # RISOLVE: NameError: name 'time' is not defined from pathlib import Path from normalize import norm_mac def show_beacon_manager(cfg): st.subheader("🏷️ Gestione Beacon e Gruppi") paths = cfg.get("paths", {}) beacon_csv = paths.get("beacons_csv", "/data/config/beacons.csv") group_csv = "/data/config/beacongroup.csv" csv_delim = paths.get("csv_delimiter", ";") # Inizializzazione session_state per il reset dei campi dopo il salva if "reset_trigger" not in st.session_state: st.session_state.reset_trigger = False def load_df(path, cols): if os.path.exists(path): try: df = pd.read_csv(path, sep=csv_delim) df.columns = [c.strip() for c in df.columns] return df except: return pd.DataFrame(columns=cols) return pd.DataFrame(columns=cols) df_beacons = load_df(beacon_csv, ["BeaconName", "MAC"]) df_groups = load_df(group_csv, ["BeaconGroupName", "GroupMAC"]) sub_tab1, sub_tab2 = st.tabs(["Individuali", "Gruppi"]) with sub_tab1: st.markdown("### 📋 Anagrafica Beacon Singoli") edited_beacons = st.data_editor( df_beacons, num_rows="dynamic", use_container_width=True, key="editor_beacons", hide_index=True ) if st.button("💾 Salva Beacon Individuali"): try: edited_beacons['MAC'] = edited_beacons['MAC'].apply(norm_mac) edited_beacons.to_csv(beacon_csv, index=False, sep=csv_delim) st.success("Anagrafica salvata!") st.rerun() except Exception as e: st.error(f"Errore: {e}") with sub_tab2: st.markdown("### 🏗️ Creazione e Gestione Gruppi") if not df_groups.empty: st.write("#### Gruppi Attivi (Vista Operatore)") mac_to_name = dict(zip(df_beacons['MAC'], df_beacons['BeaconName'])) display_data = [] for _, row in df_groups.iterrows(): group_name = row['BeaconGroupName'] macs = str(row['GroupMAC']).split(',') for m in macs: m = m.strip() display_data.append({ "Gruppo": group_name, "BeaconName": mac_to_name.get(m, "Sconosciuto"), "MAC": m }) # --- LOGICA PER UNIRE LE CELLE (Excel Style) --- # Trasformiamo Gruppo e BeaconName in Indici per raggrupparli visivamente df_display = pd.DataFrame(display_data) df_grouped = df_display.set_index(["Gruppo", "BeaconName"]) st.dataframe(df_grouped, use_container_width=True) # RIMOZIONE SELETTIVA GRUPPO st.divider() col_del1, col_del2 = st.columns([3, 1]) group_to_del = col_del1.selectbox("Seleziona gruppo da rimuovere:", df_groups["BeaconGroupName"].unique()) if col_del2.button("🗑️ Rimuovi Gruppo", use_container_width=True): df_groups = df_groups[df_groups["BeaconGroupName"] != group_to_del] df_groups.to_csv(group_csv, index=False, sep=csv_delim) st.warning(f"Gruppo '{group_to_del}' rimosso.") st.rerun() else: st.info("Nessun gruppo configurato.") st.divider() st.write("#### Aggiungi o Modifica un Gruppo") # Form per l'inserimento con reset automatico with st.form("form_nuovo_gruppo", clear_on_submit=True): gn = st.text_input("Nome Gruppo (es. GBC-01)") options = [f"{n} ({m})" for n, m in zip(df_beacons["BeaconName"], df_beacons["MAC"])] selected_options = st.multiselect("Seleziona i Beacon:", options) submit = st.form_submit_button("💾 Salva Gruppo", type="primary") if submit: if gn and selected_options: selected_macs = [opt.split("(")[-1].replace(")", "") for opt in selected_options] mac_list_str = ",".join(selected_macs) if gn in df_groups["BeaconGroupName"].values: df_groups.loc[df_groups["BeaconGroupName"] == gn, "GroupMAC"] = mac_list_str else: new_row = pd.DataFrame([{"BeaconGroupName": gn, "GroupMAC": mac_list_str}]) df_groups = pd.concat([df_groups, new_row], ignore_index=True) os.makedirs(os.path.dirname(group_csv), exist_ok=True) df_groups.to_csv(group_csv, index=False, sep=csv_delim) st.success(f"Gruppo '{gn}' salvato!") time.sleep(1) st.rerun() else: st.error("Dati incompleti: inserire Nome e selezionare i Beacon.") return df_beacons, df_groups