import streamlit as st import pandas as pd import os def load_beacons(file_path, delimiter): """Carica i beacon dal file CSV utilizzando il delimitatore configurato.""" if not os.path.exists(file_path): return pd.DataFrame(columns=["BeaconName", "MAC"]) try: return pd.read_csv(file_path, sep=delimiter) except Exception: return pd.DataFrame(columns=["BeaconName", "MAC"]) def save_beacons(file_path, df, delimiter): """Salva i beacon su CSV con il separatore corretto e crea le cartelle se necessario.""" folder = os.path.dirname(file_path) if folder and not os.path.exists(folder): os.makedirs(folder, exist_ok=True) df.to_csv(file_path, index=False, sep=delimiter) def show_beacon_manager(config): st.subheader("🏷️ Gestione Anagrafica Beacon") # Recupero parametri dalla gerarchia paths del config.yaml paths_cfg = config.get("paths", {}) beacons_file = paths_cfg.get("beacons_csv", "/data/config/beacons.csv") delimiter = paths_cfg.get("csv_delimiter", ";") # Caricamento dati df = load_beacons(beacons_file, delimiter) # --- SEZIONE AGGIUNTA --- with st.expander("➕ Aggiungi Nuovo Beacon", expanded=len(df) == 0): col1, col2 = st.columns(2) with col1: name = st.text_input("Nome Beacon (es. BC-21)") with col2: mac = st.text_input("Indirizzo MAC (es. C3:00:00:57:B9:E6)") if st.button("REGISTRA BEACON"): if name and mac: mac = mac.strip().upper() if mac in df['MAC'].values: st.error("Errore: Questo MAC è già presente in lista.") else: new_line = pd.DataFrame([{"BeaconName": name, "MAC": mac}]) df = pd.concat([df, new_line], ignore_index=True) save_beacons(beacons_file, df, delimiter) st.success(f"Beacon {name} registrato correttamente!") st.rerun() else: st.warning("Inserisci sia il Nome che il MAC address.") # --- SEZIONE VISUALIZZAZIONE E MODIFICA --- if not df.empty: st.markdown("---") st.write("### Lista Beacon") st.info("💡 Puoi modificare i nomi o i MAC direttamente cliccando nelle celle della tabella e poi cliccare su SALVA.") # Editor interattivo per modifiche "al volo" edited_df = st.data_editor( df, use_container_width=True, hide_index=True, column_config={ "BeaconName": st.column_config.TextColumn("Nome Beacon", help="Nome identificativo", required=True), "MAC": st.column_config.TextColumn("Indirizzo MAC", help="Formato AA:BB:CC...", required=True) } ) # Controllo se ci sono state modifiche if not edited_df.equals(df): if st.button("💾 SALVA MODIFICHE TABELLA"): save_beacons(beacons_file, edited_df, delimiter) st.success("Anagrafica aggiornata!") st.rerun() # --- SEZIONE ELIMINAZIONE --- st.markdown("---") st.subheader("Elimina Beacon") to_del = st.selectbox("Seleziona il beacon da rimuovere:", df['BeaconName'].tolist()) if st.button("🗑️ ELIMINA SELEZIONATO"): df = df[df['BeaconName'] != to_del] save_beacons(beacons_file, df, delimiter) st.success(f"Beacon {to_del} rimosso.") st.rerun() else: st.info("Nessun beacon configurato. Inserisci il primo beacon per creare il file.")