File size: 3,959 Bytes
01f2f24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import gradio as gr
import pandas as pd

# === Google Sheets ===
MAIN_SHEET_ID = "1cUBISFNCHqS9Ru_jBlYZgF8vb-e25wq8gC0PoT3cHlg"
MAIN_SHEET_NAME = "Sheet1"

ANNOUNCEMENT_SHEET_ID = "1B-Vhgi0BSi8iKR4_Y5ICOcf5cDd73atzq71wU17cCTs"
ANNOUNCEMENT_SHEET_NAME = "Sheet1"

# === URLs ===
main_csv_url = f"https://docs.google.com/spreadsheets/d/{MAIN_SHEET_ID}/gviz/tq?tqx=out:csv&sheet={MAIN_SHEET_NAME}"
announcement_csv_url = f"https://docs.google.com/spreadsheets/d/{ANNOUNCEMENT_SHEET_ID}/gviz/tq?tqx=out:csv&sheet={ANNOUNCEMENT_SHEET_NAME}"

# === Password ===
ADMIN_PASSWORD = "1234"  # change this if needed


# === Fetch Functions ===
def fetch_data():
    try:
        df = pd.read_csv(main_csv_url)
        df = df.head(10)
        return df
    except Exception as e:
        return pd.DataFrame({"Error": [f"Failed to fetch main data: {e}"]})


def fetch_announcements():
    try:
        df = pd.read_csv(announcement_csv_url)
        return df
    except Exception as e:
        return pd.DataFrame({"Error": [f"Failed to fetch announcements: {e}"]})


# === Convert DataFrame to Cards ===
def df_to_cards(df, page_name="Main"):
    if df.empty:
        return "<p style='color:red;'>No data found.</p>"
    html = "<div style='display:flex;flex-wrap:wrap;gap:10px;justify-content:center;'>"
    for _, row in df.iterrows():
        html += f"""
        <div style='width:300px;background:#ffffff;border-radius:15px;padding:15px;
                    box-shadow:0 3px 8px rgba(0,0,0,0.15);font-family:sans-serif;'>
            <h3 style='color:#333;margin-bottom:5px;'>{row.iloc[0]}</h3>
            <p style='margin:4px 0;color:#555;font-size:14px;'><b>Details:</b> {', '.join(map(str, row.values[1:]))}</p>
        </div>
        """
    html += "</div>"
    return html


# === Interface ===
with gr.Blocks(theme=gr.themes.Soft()) as demo:
    # --- HEADER ---
    with gr.Row():
        gr.Markdown("### πŸ”₯ Blaze Dashboard", elem_id="title")
        admin_btn = gr.Button("πŸ‘¨β€πŸ’Ό ADMIN", elem_id="admin_button")

    # --- MAIN PAGE ---
    with gr.Column(visible=True) as main_page:
        gr.Markdown("### πŸ“Š Main Data")
        main_cards = gr.HTML()
        refresh_btn = gr.Button("πŸ”„ Refresh Data")

    # --- PASSWORD PAGE ---
    with gr.Column(visible=False) as password_page:
        gr.Markdown("### πŸ” Admin Login")
        password_input = gr.Textbox(label="Enter Password", type="password")
        submit_pass = gr.Button("Submit")

    # --- ADMIN PAGE ---
    with gr.Column(visible=False) as admin_page:
        gr.Markdown("### πŸ“’ Important Announcements")
        admin_cards = gr.HTML()
        back_btn = gr.Button("β¬… Back")

    # --- Logic ---
    def refresh_main():
        df = fetch_data()
        return df_to_cards(df, "Main")

    def go_admin():
        return gr.update(visible=False), gr.update(visible=True), gr.update(visible=False)

    def verify_password(pw):
        if pw == ADMIN_PASSWORD:
            df = fetch_announcements()
            return (
                gr.update(visible=False),
                gr.update(visible=False),
                gr.update(visible=True),
                df_to_cards(df, "Announcements"),
            )
        else:
            return (
                gr.update(visible=False),
                gr.update(visible=True),
                gr.update(visible=False),
                "<p style='color:red;'>❌ Incorrect password.</p>",
            )

    refresh_btn.click(refresh_main, outputs=main_cards)
    admin_btn.click(go_admin, outputs=[main_page, password_page, admin_page])
    submit_pass.click(verify_password, inputs=password_input, outputs=[main_page, password_page, admin_page, admin_cards])
    back_btn.click(lambda: (gr.update(visible=True), gr.update(visible=False), gr.update(visible=False)), outputs=[main_page, password_page, admin_page])

    # Load initial data
    demo.load(refresh_main, outputs=main_cards)

demo.launch(share=True)