Bayhaqy commited on
Commit
e5fe1fb
·
verified ·
1 Parent(s): 90dc8f3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +31 -58
app.py CHANGED
@@ -1,31 +1,12 @@
1
- import os
2
  import gradio as gr
3
  import pandas as pd
4
 
5
- EXCEL_FILE = "database.xlsx"
6
-
7
- def load_data():
8
- if os.path.exists(EXCEL_FILE):
9
- try:
10
- xls = pd.ExcelFile(EXCEL_FILE)
11
- df_data = pd.read_excel(xls, "DATA")
12
- df_users = pd.read_excel(xls, "USERS")
13
- return df_data, df_users
14
- except Exception as e:
15
- print(f"Error loading Excel file: {e}")
16
- # create empty defaults if file not found or error
17
- df_data = pd.DataFrame(columns=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"])
18
- df_users = pd.DataFrame([{"USERNAME": "ADMIN", "PASSWORD": "ADMIN"}])
19
- save_data(df_data, df_users)
20
- return df_data, df_users
21
-
22
- def save_data(df_data, df_users):
23
- with pd.ExcelWriter(EXCEL_FILE, engine="openpyxl") as writer:
24
- df_data.to_excel(writer, sheet_name="DATA", index=False)
25
- df_users.to_excel(writer, sheet_name="USERS", index=False)
26
-
27
- df, users_df = load_data()
28
 
 
29
  def to_upper(df_input):
30
  return df_input.applymap(lambda x: str(x).upper().strip() if pd.notnull(x) else x)
31
 
@@ -33,7 +14,7 @@ def get_active_data():
33
  return df[df["REMARK"].str.upper() != "DELETE"].reset_index(drop=True)
34
 
35
  def login(username, password):
36
- username = username.strip().upper()
37
  password = password.strip()
38
  is_valid = not users_df[(users_df["USERNAME"] == username) & (users_df["PASSWORD"] == password)].empty
39
  if is_valid:
@@ -48,11 +29,13 @@ def bulk_submit(dataframe):
48
  new_df = to_upper(new_df)
49
  required = ["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"]
50
  new_df = new_df[required].dropna()
 
51
  pk_cols = required
 
52
  merged = pd.merge(new_df, df[pk_cols], on=pk_cols, how="left", indicator=True)
53
  df_filtered = new_df[merged["_merge"] == "left_only"]
 
54
  df = pd.concat([df, df_filtered], ignore_index=True)
55
- save_data(df, users_df)
56
  return get_active_data()
57
 
58
  def delete_selected_rows(selected_df):
@@ -71,7 +54,6 @@ def delete_selected_rows(selected_df):
71
  (df["REMARK"].str.upper() != "DELETE")
72
  )
73
  df.loc[mask, "REMARK"] = "DELETE"
74
- save_data(df, users_df)
75
  return "Berhasil dihapus.", get_active_data()
76
  except Exception as e:
77
  return f"Error: {e}", get_active_data()
@@ -85,7 +67,6 @@ def add_user(username, password):
85
  if username in users_df["USERNAME"].values:
86
  return "Username sudah ada", show_users()
87
  users_df = pd.concat([users_df, pd.DataFrame([{"USERNAME": username, "PASSWORD": password}])], ignore_index=True)
88
- save_data(df, users_df)
89
  return f"User {username} ditambahkan", show_users()
90
 
91
  def delete_user(username):
@@ -94,26 +75,12 @@ def delete_user(username):
94
  if username == "ADMIN":
95
  return "ADMIN tidak boleh dihapus", show_users()
96
  users_df = users_df[users_df["USERNAME"] != username].reset_index(drop=True)
97
- save_data(df, users_df)
98
  return f"User {username} dihapus", show_users()
99
 
100
  def show_users():
101
  return users_df.copy()
102
 
103
- def show_guide():
104
- return """
105
- ### Panduan Penggunaan Aplikasi
106
- 1. **Login**
107
- - Gunakan username dan password untuk masuk.
108
- 2. **Input Data**
109
- - Lihat data aktif.
110
- - Input data baru dengan kolom lengkap.
111
- - Pilih baris dan klik "Delete Selected Rows" untuk tandai delete.
112
- 3. **Manajemen User**
113
- - Tambah dan hapus user (kecuali ADMIN).
114
- 4. **Data yang dihapus tidak benar-benar dihapus**, hanya ditandai `REMARK = DELETE`.
115
- """
116
-
117
  with gr.Blocks() as app:
118
  gr.Markdown("## Login")
119
  login_box = gr.Column(visible=True)
@@ -126,22 +93,23 @@ with gr.Blocks() as app:
126
  tab_section = gr.Tabs(visible=False)
127
  with tab_section:
128
  with gr.Tab("Input Data"):
129
- gr.Markdown("### Data Aktif")
130
- df_list = gr.Dataframe(
131
- label="List Data Aktif",
132
- interactive=False,
133
- wrap=True,
134
- value=get_active_data()
135
- )
136
- selected_df = gr.Dataframe(visible=False)
137
  gr.Markdown("### Input Data Baru")
138
  df_input = gr.Dataframe(
139
  headers=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"],
140
  row_count=5,
141
- col_count=7,
142
  label="Form Input"
143
  )
144
  btn_submit = gr.Button("Submit Data")
 
 
 
 
 
 
 
 
 
145
  btn_delete = gr.Button("Delete Selected Rows")
146
  delete_msg = gr.Textbox(visible=True, interactive=False, show_label=False)
147
 
@@ -153,16 +121,21 @@ with gr.Blocks() as app:
153
  del_user = gr.Textbox(label="Delete Username")
154
  btn_del = gr.Button("Delete User")
155
  user_msg = gr.Textbox(visible=True, interactive=False, show_label=False)
156
- user_table = gr.Dataframe(label="User List", interactive=False, value=show_users())
157
 
158
- with gr.Tab("User Guide"):
159
- gr.Markdown(show_guide())
 
160
 
161
- btn_login.click(fn=login, inputs=[user, pw], outputs=[login_msg, login_box, tab_section, df_list, user_table])
162
  btn_submit.click(fn=bulk_submit, inputs=[df_input], outputs=[df_list])
163
- 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])
 
 
 
 
164
  btn_delete.click(fn=delete_selected_rows, inputs=[selected_df], outputs=[delete_msg, df_list])
 
165
  btn_add.click(fn=add_user, inputs=[new_user, new_pass], outputs=[user_msg, user_table])
166
  btn_del.click(fn=delete_user, inputs=[del_user], outputs=[user_msg, user_table])
167
 
168
- app.launch(auth=lambda u, p: (u.upper(), p) in zip(users_df["USERNAME"], users_df["PASSWORD"]))
 
 
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
 
 
14
  return df[df["REMARK"].str.upper() != "DELETE"].reset_index(drop=True)
15
 
16
  def login(username, password):
17
+ username = username.strip().lower()
18
  password = password.strip()
19
  is_valid = not users_df[(users_df["USERNAME"] == username) & (users_df["PASSWORD"] == password)].empty
20
  if is_valid:
 
29
  new_df = to_upper(new_df)
30
  required = ["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"]
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):
 
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()
 
67
  if username in users_df["USERNAME"].values:
68
  return "Username sudah ada", show_users()
69
  users_df = pd.concat([users_df, pd.DataFrame([{"USERNAME": username, "PASSWORD": password}])], ignore_index=True)
 
70
  return f"User {username} ditambahkan", show_users()
71
 
72
  def delete_user(username):
 
75
  if username == "ADMIN":
76
  return "ADMIN tidak boleh dihapus", show_users()
77
  users_df = users_df[users_df["USERNAME"] != username].reset_index(drop=True)
 
78
  return f"User {username} dihapus", show_users()
79
 
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
 
 
121
  del_user = gr.Textbox(label="Delete Username")
122
  btn_del = gr.Button("Delete User")
123
  user_msg = gr.Textbox(visible=True, interactive=False, show_label=False)
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])
140
 
141
+ app.launch()