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()