Bayhaqy commited on
Commit
32051a4
·
verified ·
1 Parent(s): e5fe1fb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -32
app.py CHANGED
@@ -1,12 +1,33 @@
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,8 +35,7 @@ def get_active_data():
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:
21
  return "", gr.update(visible=False), gr.update(visible=True), get_active_data(), show_users()
@@ -29,13 +49,11 @@ def bulk_submit(dataframe):
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,19 +72,20 @@ 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()
60
 
61
  def add_user(username, password):
62
  global users_df
63
- username = username.strip().upper()
64
- password = password.strip()
65
  if not username or not password:
66
  return "Username/password tidak boleh kosong", show_users()
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,12 +94,27 @@ 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,6 +127,21 @@ with gr.Blocks() as app:
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"],
@@ -101,15 +150,6 @@ with gr.Blocks() as app:
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
 
@@ -123,18 +163,15 @@ with gr.Blocks() as app:
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
 
 
1
  import gradio as gr
2
  import pandas as pd
3
+ import os
4
+
5
+ # ========== Constants ==========
6
+ EXCEL_FILE = "data_store.xlsx"
7
+ DATA_SHEET = "DATA"
8
+ USER_SHEET = "USERS"
9
+
10
+ # ========== Load or Create Data ==========
11
+ def load_data():
12
+ if os.path.exists(EXCEL_FILE):
13
+ xls = pd.read_excel(EXCEL_FILE, sheet_name=None)
14
+ df_data = xls.get(DATA_SHEET, pd.DataFrame(columns=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"]))
15
+ df_users = xls.get(USER_SHEET, pd.DataFrame([{"USERNAME": "ADMIN", "PASSWORD": "ADMIN"}]))
16
+ else:
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(data_df, users_df):
23
+ with pd.ExcelWriter(EXCEL_FILE, engine='openpyxl', mode='w') as writer:
24
+ data_df.to_excel(writer, index=False, sheet_name=DATA_SHEET)
25
+ users_df.to_excel(writer, index=False, sheet_name=USER_SHEET)
26
+
27
+ # ========== Initial Data ==========
28
+ df, users_df = load_data()
29
+
30
+ # ========== Helpers ==========
31
  def to_upper(df_input):
32
  return df_input.applymap(lambda x: str(x).upper().strip() if pd.notnull(x) else x)
33
 
 
35
  return df[df["REMARK"].str.upper() != "DELETE"].reset_index(drop=True)
36
 
37
  def login(username, password):
38
+ username, password = username.strip().upper(), password.strip()
 
39
  is_valid = not users_df[(users_df["USERNAME"] == username) & (users_df["PASSWORD"] == password)].empty
40
  if is_valid:
41
  return "", gr.update(visible=False), gr.update(visible=True), get_active_data(), show_users()
 
49
  new_df = to_upper(new_df)
50
  required = ["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"]
51
  new_df = new_df[required].dropna()
 
52
  pk_cols = required
 
53
  merged = pd.merge(new_df, df[pk_cols], on=pk_cols, how="left", indicator=True)
54
  df_filtered = new_df[merged["_merge"] == "left_only"]
 
55
  df = pd.concat([df, df_filtered], ignore_index=True)
56
+ save_data(df, users_df)
57
  return get_active_data()
58
 
59
  def delete_selected_rows(selected_df):
 
72
  (df["REMARK"].str.upper() != "DELETE")
73
  )
74
  df.loc[mask, "REMARK"] = "DELETE"
75
+ save_data(df, users_df)
76
  return "Berhasil dihapus.", get_active_data()
77
  except Exception as e:
78
  return f"Error: {e}", get_active_data()
79
 
80
  def add_user(username, password):
81
  global users_df
82
+ username, password = username.strip().upper(), password.strip()
 
83
  if not username or not password:
84
  return "Username/password tidak boleh kosong", show_users()
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
  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.
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
+ # ========== UI ==========
118
  with gr.Blocks() as app:
119
  gr.Markdown("## Login")
120
  login_box = gr.Column(visible=True)
 
127
  tab_section = gr.Tabs(visible=False)
128
  with tab_section:
129
  with gr.Tab("Input Data"):
130
+ gr.Markdown("### Data Aktif")
131
+ df_list = gr.Dataframe(
132
+ label="List Data Aktif",
133
+ interactive=False,
134
+ column_widths=["auto"]*7,
135
+ wrap=True,
136
+ show_copy_button=True,
137
+ show_download_button=True,
138
+ show_fullscreen_button=True,
139
+ show_search=True,
140
+ show_row_numbers=True,
141
+ pinned_columns=["USERNAME"]
142
+ )
143
+ selected_df = gr.Dataframe(visible=False)
144
+ gr.Line()
145
  gr.Markdown("### Input Data Baru")
146
  df_input = gr.Dataframe(
147
  headers=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL", "REMARK"],
 
150
  label="Form Input"
151
  )
152
  btn_submit = gr.Button("Submit Data")
 
 
 
 
 
 
 
 
 
153
  btn_delete = gr.Button("Delete Selected Rows")
154
  delete_msg = gr.Textbox(visible=True, interactive=False, show_label=False)
155
 
 
163
  user_msg = gr.Textbox(visible=True, interactive=False, show_label=False)
164
  user_table = gr.Dataframe(label="User List", interactive=False)
165
 
166
+ with gr.Tab("User Guide"):
167
+ gr.Markdown(show_guide())
 
168
 
169
+ # ==== Events ====
170
+ btn_login.click(fn=login, inputs=[user, pw], outputs=[login_msg, login_box, tab_section, df_list, user_table])
171
  btn_submit.click(fn=bulk_submit, inputs=[df_input], outputs=[df_list])
 
172
  df_list.select(fn=lambda df, evt: df.iloc[[evt.index]] if evt.index is not None else pd.DataFrame(),
173
+ inputs=[df_list], outputs=[selected_df])
 
 
174
  btn_delete.click(fn=delete_selected_rows, inputs=[selected_df], outputs=[delete_msg, df_list])
 
175
  btn_add.click(fn=add_user, inputs=[new_user, new_pass], outputs=[user_msg, user_table])
176
  btn_del.click(fn=delete_user, inputs=[del_user], outputs=[user_msg, user_table])
177