83 lines
2.7 KiB
Python
83 lines
2.7 KiB
Python
import streamlit as st
|
|
import pandas as pd
|
|
import plotly.express as px
|
|
|
|
# Umrechnungsfaktor von Terabytes nach Bytes
|
|
TB2B = 1024**4
|
|
|
|
# Seitenkonfiguration (gibt uns ein schönes breites Layout)
|
|
st.set_page_config(layout="wide")
|
|
|
|
# 1. Daten laden (Pfad aus deinem Docker-Setup)
|
|
FILE_PATH = "/data/json_cache.json"
|
|
|
|
|
|
@st.cache_data
|
|
def load_data():
|
|
# Falls die Datei existiert, laden, sonst leeres Dataframe für den Test
|
|
try:
|
|
return pd.read_json(FILE_PATH)
|
|
except Exception:
|
|
# Dummy-Daten, falls Node-RED noch nichts abgelegt hat
|
|
return pd.DataFrame([
|
|
{"ownerGroup": "a-123", "department": "4000", "size": 500000},
|
|
{"ownerGroup": "p9999", "department": "6000", "size": 1200000}
|
|
])
|
|
|
|
|
|
df = load_data()
|
|
|
|
# 2. NAVIGATION LINKS (Sidebar)
|
|
st.sidebar.title("Navigation")
|
|
st.sidebar.markdown("Wählen Sie eine Ansicht:")
|
|
|
|
# Ein Radio-Button verhält sich wie eine klickbare Liste
|
|
auswahl = st.sidebar.radio(
|
|
label="Ansichten",
|
|
options=["Übersicht & Metriken", "Bereichs-Analyse", "Nicht zuweisbare Daten", "Rohdaten"],
|
|
label_visibility="collapsed" # Versteckt das Label für eine sauberere Optik
|
|
)
|
|
|
|
# 3. ANZEIGE RECHTS (Hauptbildschirm)
|
|
# Hier steuern wir den Inhalt basierend auf der Auswahl links
|
|
|
|
if auswahl == "Übersicht & Metriken":
|
|
st.title("Übersicht")
|
|
|
|
# Beispiel für schnelle Metriken rechts
|
|
col1, col2 = st.columns(2)
|
|
col1.metric("Anzahl Archivgruppen", len(df))
|
|
col2.metric("Gesamtvolumen (TB)", f'{df["size"].sum()/TB2B:.2f}' if "size" in df else "0.00")
|
|
|
|
# Hier könnte eine Grafik hin
|
|
if "department" in df:
|
|
fig = px.pie(df, names="department", title="Verteilung nach Departments")
|
|
st.plotly_chart(fig, use_container_width=True)
|
|
|
|
elif auswahl == "Bereichs-Analyse":
|
|
st.title("Bereichs-Analyse")
|
|
st.write("Filtern Sie die Daten gezielt nach einzelnen Abteilungen.")
|
|
|
|
# Ein zusätzlicher Filter, der nur in dieser Ansicht erscheint
|
|
if "department" in df:
|
|
depts = sorted(df["department"].unique().tolist())
|
|
gewaehltes_dept = st.selectbox("Wählen Sie ein Department:", depts)
|
|
|
|
filtered_df = df[df["department"] == gewaehltes_dept]
|
|
st.metric(f"Gruppen in Department {gewaehltes_dept}", len(filtered_df))
|
|
st.dataframe(filtered_df, use_container_width=True)
|
|
|
|
elif auswahl == "Nicht zuweisbare Daten":
|
|
st.title("Nicht zuweisbare Daten")
|
|
|
|
# Die Tabelle, die du schon gebaut hast
|
|
st.dataframe(df, use_container_width=True)
|
|
|
|
elif auswahl == "Rohdaten":
|
|
st.title("Rohdaten")
|
|
st.write("Durchsuchen und filtern Sie die vollständige Liste der Gruppen.")
|
|
|
|
# Die Tabelle, die du schon gebaut hast
|
|
st.dataframe(df, use_container_width=True)
|
|
|