Spaces:
Sleeping
Sleeping
File size: 5,724 Bytes
32647ef 5573f9e 32647ef f62726e 37ebfd4 f73ebfc f62726e 32647ef f62726e 1cef742 32647ef 66c18e8 1cef742 f84580d f73ebfc f84580d 1cef742 66c18e8 1cef742 66c18e8 5573f9e 66c18e8 f62726e 1cef742 66c18e8 1cef742 66c18e8 f62726e 5573f9e 66c18e8 f62726e 66c18e8 1cef742 66c18e8 f84580d 66c18e8 1cef742 66c18e8 1cef742 66c18e8 1cef742 f84580d 66c18e8 f84580d 66c18e8 1cef742 66c18e8 1cef742 f84580d f62726e 5573f9e 1cef742 66c18e8 f62726e 1cef742 0e66cc6 89f3dc3 0e66cc6 f62726e 89f3dc3 1cef742 f62726e 66c18e8 f62726e 66c18e8 f62726e 66c18e8 1cef742 66c18e8 1cef742 66c18e8 1cef742 f62726e 1cef742 89f3dc3 1cef742 f62726e 37ebfd4 1cef742 f84580d 5573f9e |
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 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
import gradio as gr
import pandas as pd
# ======= Global Data Store =======
df = pd.DataFrame(columns=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"])
users_df = pd.DataFrame([{"USERNAME": "admin", "PASSWORD": "admin"}])
selected_indices = []
# ======= Helper Functions =======
def to_upper(df_input):
return df_input.applymap(lambda x: str(x).upper().strip() if pd.notnull(x) else x)
def get_active_data():
return df[df["REMARK"].str.upper() != "DELETE"].reset_index(drop=True)
def login(username, password):
username = username.strip().lower()
password = password.strip()
is_valid = not users_df[(users_df["USERNAME"] == username) & (users_df["PASSWORD"] == password)].empty
if is_valid:
return "", gr.update(visible=False), gr.update(visible=True), get_active_data(), show_users()
return "Invalid login", gr.update(visible=True), gr.update(visible=False), pd.DataFrame(), pd.DataFrame()
def bulk_submit(dataframe):
global df
new_df = pd.DataFrame(dataframe).dropna(how="all")
if new_df.empty:
return get_active_data()
new_df = to_upper(new_df)
required = ["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"]
new_df = new_df[required].dropna()
pk_cols = required
# Filter out duplicates
merged = pd.merge(new_df, df[pk_cols], on=pk_cols, how="left", indicator=True)
df_filtered = new_df[merged["_merge"] == "left_only"]
df = pd.concat([df, df_filtered], ignore_index=True)
return get_active_data()
def delete_selected_rows(selected_df):
global df
try:
if selected_df.empty:
return "Tidak ada baris yang dipilih", get_active_data()
for _, row in selected_df.iterrows():
mask = (
(df["USERNAME"] == row["USERNAME"]) &
(df["COUNTRYCODE"] == row["COUNTRYCODE"]) &
(df["SBUCODE"] == row["SBUCODE"]) &
(df["BRANDCODE"] == row["BRANDCODE"]) &
(df["CONCEPTCODE"] == row["CONCEPTCODE"]) &
(df["CHANNEL"] == row["CHANNEL"]) &
(df["REMARK"].str.upper() != "DELETE")
)
df.loc[mask, "REMARK"] = "DELETE"
return "Berhasil dihapus.", get_active_data()
except Exception as e:
return f"Error: {e}", get_active_data()
def add_user(username, password):
global users_df
username = username.strip().upper()
password = password.strip()
if not username or not password:
return "Username/password tidak boleh kosong", show_users()
if username in users_df["USERNAME"].values:
return "Username sudah ada", show_users()
users_df = pd.concat([users_df, pd.DataFrame([{"USERNAME": username, "PASSWORD": password}])], ignore_index=True)
return f"User {username} ditambahkan", show_users()
def delete_user(username):
global users_df
username = username.strip().upper()
if username == "ADMIN":
return "ADMIN tidak boleh dihapus", show_users()
users_df = users_df[users_df["USERNAME"] != username].reset_index(drop=True)
return f"User {username} dihapus", show_users()
def show_users():
return users_df.copy()
# ======= UI Layout =======
with gr.Blocks() as app:
gr.Markdown("## Login")
login_box = gr.Column(visible=True)
with login_box:
user = gr.Textbox(label="Username")
pw = gr.Textbox(label="Password", type="password")
btn_login = gr.Button("Login")
login_msg = gr.Textbox(visible=True, interactive=False, show_label=False)
tab_section = gr.Tabs(visible=False)
with tab_section:
with gr.Tab("Input Data"):
gr.Markdown("### Input Data Baru")
df_input = gr.Dataframe(
headers=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"],
row_count=5,
col_count=(7, "fixed"),
label="Form Input"
)
btn_submit = gr.Button("Submit Data")
gr.Markdown("### Data Aktif")
df_list = gr.Dataframe(
label="List Data Aktif",
interactive=False,
wrap=True,
column_widths=["auto"] * 7
)
selected_df = gr.Dataframe(visible=False)
btn_delete = gr.Button("Delete Selected Rows")
delete_msg = gr.Textbox(visible=True, interactive=False, show_label=False)
with gr.Tab("User Management"):
gr.Markdown("### Kelola User")
new_user = gr.Textbox(label="New Username")
new_pass = gr.Textbox(label="New Password")
btn_add = gr.Button("Add User")
del_user = gr.Textbox(label="Delete Username")
btn_del = gr.Button("Delete User")
user_msg = gr.Textbox(visible=True, interactive=False, show_label=False)
user_table = gr.Dataframe(label="User List", interactive=False)
# ==== Events ====
btn_login.click(fn=login, inputs=[user, pw],
outputs=[login_msg, login_box, tab_section, df_list, user_table])
btn_submit.click(fn=bulk_submit, inputs=[df_input], outputs=[df_list])
df_list.select(fn=lambda df, evt: df.iloc[[evt.index]] if evt.index is not None else pd.DataFrame(),
inputs=[df_list],
outputs=[selected_df])
btn_delete.click(fn=delete_selected_rows, inputs=[selected_df], outputs=[delete_msg, df_list])
btn_add.click(fn=add_user, inputs=[new_user, new_pass], outputs=[user_msg, user_table])
btn_del.click(fn=delete_user, inputs=[del_user], outputs=[user_msg, user_table])
app.launch() |