Bayhaqy commited on
Commit
f62726e
·
verified ·
1 Parent(s): 5815604

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +39 -17
app.py CHANGED
@@ -1,11 +1,12 @@
1
  import gradio as gr
2
  import pandas as pd
3
 
4
- # ===== Global Storage =====
5
  df = pd.DataFrame(columns=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"])
6
  users_df = pd.DataFrame([{"USERNAME": "ADMIN", "PASSWORD": "ADMIN"}])
 
7
 
8
- # ===== Helper Functions =====
9
  def to_upper(df_input):
10
  return df_input.applymap(lambda x: str(x).upper().strip() if pd.notnull(x) else x)
11
 
@@ -30,21 +31,30 @@ def bulk_submit(dataframe):
30
  new_df = new_df[required].dropna()
31
 
32
  pk_cols = required
33
- # Filter out duplicates based on all PK cols
34
  merged = pd.merge(new_df, df[pk_cols], on=pk_cols, how="left", indicator=True)
35
  df_filtered = new_df[merged["_merge"] == "left_only"]
36
 
37
  df = pd.concat([df, df_filtered], ignore_index=True)
38
  return get_active_data()
39
 
40
- def delete_selected(selected_idxs):
41
  global df
42
  try:
43
- active_df = get_active_data()
44
- for i in selected_idxs:
45
- idx = active_df.index[i]
46
- df.loc[idx, "REMARK"] = "DELETE"
47
- return "Berhasil dihapus (soft delete).", get_active_data()
 
 
 
 
 
 
 
 
 
48
  except Exception as e:
49
  return f"Error: {e}", get_active_data()
50
 
@@ -70,7 +80,7 @@ def delete_user(username):
70
  def show_users():
71
  return users_df.copy()
72
 
73
- # ===== Gradio UI =====
74
  with gr.Blocks() as app:
75
  gr.Markdown("## Login")
76
  login_box = gr.Column(visible=True)
@@ -83,21 +93,28 @@ with gr.Blocks() as app:
83
  tab_section = gr.Tabs(visible=False)
84
  with tab_section:
85
  with gr.Tab("Input Data"):
86
- gr.Markdown("### Input dan Monitoring Data")
87
  df_input = gr.Dataframe(
88
  headers=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"],
89
  row_count=5,
90
  col_count=(7, "fixed"),
91
- label="Input Data Baru"
92
  )
93
  btn_submit = gr.Button("Submit Data")
 
94
  gr.Markdown("### Data Aktif")
95
- df_list = gr.Dataframe(label="List Data Aktif", interactive=False, row_selectable=True)
96
- btn_delete = gr.Button("Delete Selected")
 
 
 
 
 
 
97
  delete_msg = gr.Textbox(visible=True, interactive=False, show_label=False)
98
 
99
  with gr.Tab("User Management"):
100
- gr.Markdown("### Manajemen User Login")
101
  new_user = gr.Textbox(label="New Username")
102
  new_pass = gr.Textbox(label="New Password")
103
  btn_add = gr.Button("Add User")
@@ -107,11 +124,16 @@ with gr.Blocks() as app:
107
  user_table = gr.Dataframe(label="User List", interactive=False)
108
 
109
  # ==== Events ====
110
- btn_login.click(fn=login, inputs=[user, pw],
111
  outputs=[login_msg, login_box, tab_section, df_list, user_table])
112
 
113
  btn_submit.click(fn=bulk_submit, inputs=[df_input], outputs=[df_list])
114
- btn_delete.click(fn=delete_selected, inputs=[df_list.selected], outputs=[delete_msg, df_list])
 
 
 
 
 
115
 
116
  btn_add.click(fn=add_user, inputs=[new_user, new_pass], outputs=[user_msg, user_table])
117
  btn_del.click(fn=delete_user, inputs=[del_user], outputs=[user_msg, user_table])
 
1
  import gradio as gr
2
  import pandas as pd
3
 
4
+ # ======= Global Data Store =======
5
  df = pd.DataFrame(columns=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"])
6
  users_df = pd.DataFrame([{"USERNAME": "ADMIN", "PASSWORD": "ADMIN"}])
7
+ selected_indices = []
8
 
9
+ # ======= Helper Functions =======
10
  def to_upper(df_input):
11
  return df_input.applymap(lambda x: str(x).upper().strip() if pd.notnull(x) else x)
12
 
 
31
  new_df = new_df[required].dropna()
32
 
33
  pk_cols = required
34
+ # Filter out duplicates
35
  merged = pd.merge(new_df, df[pk_cols], on=pk_cols, how="left", indicator=True)
36
  df_filtered = new_df[merged["_merge"] == "left_only"]
37
 
38
  df = pd.concat([df, df_filtered], ignore_index=True)
39
  return get_active_data()
40
 
41
+ def delete_selected_rows(selected_df):
42
  global df
43
  try:
44
+ if selected_df.empty:
45
+ return "Tidak ada baris yang dipilih", get_active_data()
46
+ for _, row in selected_df.iterrows():
47
+ mask = (
48
+ (df["USERNAME"] == row["USERNAME"]) &
49
+ (df["COUNTRYCODE"] == row["COUNTRYCODE"]) &
50
+ (df["SBUCODE"] == row["SBUCODE"]) &
51
+ (df["BRANDCODE"] == row["BRANDCODE"]) &
52
+ (df["CONCEPTCODE"] == row["CONCEPTCODE"]) &
53
+ (df["CHANNEL"] == row["CHANNEL"]) &
54
+ (df["REMARK"].str.upper() != "DELETE")
55
+ )
56
+ df.loc[mask, "REMARK"] = "DELETE"
57
+ return "Berhasil dihapus.", get_active_data()
58
  except Exception as e:
59
  return f"Error: {e}", get_active_data()
60
 
 
80
  def show_users():
81
  return users_df.copy()
82
 
83
+ # ======= UI Layout =======
84
  with gr.Blocks() as app:
85
  gr.Markdown("## Login")
86
  login_box = gr.Column(visible=True)
 
93
  tab_section = gr.Tabs(visible=False)
94
  with tab_section:
95
  with gr.Tab("Input Data"):
96
+ gr.Markdown("### Input Data Baru")
97
  df_input = gr.Dataframe(
98
  headers=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"],
99
  row_count=5,
100
  col_count=(7, "fixed"),
101
+ label="Form Input"
102
  )
103
  btn_submit = gr.Button("Submit Data")
104
+
105
  gr.Markdown("### Data Aktif")
106
+ df_list = gr.Dataframe(
107
+ label="List Data Aktif",
108
+ interactive=False,
109
+ wrap=True,
110
+ column_widths=["auto"] * 7
111
+ )
112
+ selected_df = gr.Dataframe(visible=False)
113
+ btn_delete = gr.Button("Delete Selected Rows")
114
  delete_msg = gr.Textbox(visible=True, interactive=False, show_label=False)
115
 
116
  with gr.Tab("User Management"):
117
+ gr.Markdown("### Kelola User")
118
  new_user = gr.Textbox(label="New Username")
119
  new_pass = gr.Textbox(label="New Password")
120
  btn_add = gr.Button("Add User")
 
124
  user_table = gr.Dataframe(label="User List", interactive=False)
125
 
126
  # ==== Events ====
127
+ btn_login.click(fn=login, inputs=[user, pw],
128
  outputs=[login_msg, login_box, tab_section, df_list, user_table])
129
 
130
  btn_submit.click(fn=bulk_submit, inputs=[df_input], outputs=[df_list])
131
+
132
+ df_list.select(fn=lambda df, evt: df.iloc[[evt.index]] if evt.index is not None else pd.DataFrame(),
133
+ inputs=[df_list],
134
+ outputs=[selected_df])
135
+
136
+ btn_delete.click(fn=delete_selected_rows, inputs=[selected_df], outputs=[delete_msg, df_list])
137
 
138
  btn_add.click(fn=add_user, inputs=[new_user, new_pass], outputs=[user_msg, user_table])
139
  btn_del.click(fn=delete_user, inputs=[del_user], outputs=[user_msg, user_table])