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