File size: 4,410 Bytes
6ca8ec7
 
 
 
 
 
 
 
6fe716c
6ca8ec7
6fe716c
 
 
 
 
 
 
 
 
 
 
 
 
 
6ca8ec7
 
6fe716c
 
6ca8ec7
6fe716c
 
 
6ca8ec7
 
e15ce8c
 
 
 
 
 
 
 
 
 
6ca8ec7
 
 
e15ce8c
6ca8ec7
 
 
e15ce8c
6ca8ec7
 
 
 
e15ce8c
 
 
 
 
 
 
 
 
 
6ca8ec7
 
 
 
 
 
 
 
 
6fe716c
 
6ca8ec7
 
 
6fe716c
6ca8ec7
 
 
e15ce8c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6ca8ec7
 
 
 
 
 
 
 
 
 
 
 
6fe716c
 
6ca8ec7
 
6fe716c
6ca8ec7
6fe716c
6ca8ec7
 
 
 
 
 
 
 
 
 
 
 
 
6fe716c
 
6ca8ec7
 
6fe716c
6ca8ec7
 
 
 
 
 
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
142
import dash
from dash import dcc, html, Input, Output, State, callback
import dash_bootstrap_components as dbc
import uuid
import sqlite3

app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])

DB_FILE = 'links.db'

def get_db_connection():
    conn = sqlite3.connect(DB_FILE, check_same_thread=False)
    conn.row_factory = sqlite3.Row
    return conn

def init_db():
    conn = get_db_connection()
    c = conn.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS links
                 (id TEXT PRIMARY KEY, name TEXT, url TEXT)''')
    conn.commit()
    conn.close()

init_db()

def get_links():
    conn = get_db_connection()
    c = conn.cursor()
    c.execute("SELECT * FROM links")
    links = [dict(row) for row in c.fetchall()]
    conn.close()
    return links

app.layout = dbc.Container([
    dbc.Modal([
        dbc.ModalHeader("Add New URL"),
        dbc.ModalBody([
            dbc.Input(id='new-url-name', placeholder="URL Name", className="mb-2"),
            dbc.Input(id='new-url-link', placeholder="URL", className="mb-2"),
        ]),
        dbc.ModalFooter(
            dbc.Button("Add", id="add-url-button", className="ml-auto")
        ),
    ], id="add-url-modal"),
    dbc.Row([
        dbc.Col([
            html.H2("My URL App", className="mt-3 mb-4"),
            dbc.Button("Add URL", id="open-modal-button", color="primary", className="mb-3"),
            html.Div(id='url-list'),
        ], width=3, className="bg-light p-3"),
        dbc.Col([
            html.Iframe(id='content-iframe', style={'width': '100%', 'height': '800px'}, sandbox="allow-scripts allow-same-origin")
        ], width=9)
    ])
], fluid=True)

@callback(
    Output("add-url-modal", "is_open"),
    [Input("open-modal-button", "n_clicks"), Input("add-url-button", "n_clicks")],
    [State("add-url-modal", "is_open")],
)
def toggle_modal(n1, n2, is_open):
    if n1 or n2:
        return not is_open
    return is_open

@callback(
    Output('url-list', 'children'),
    Input('add-url-button', 'n_clicks'),
    State('new-url-name', 'value'),
    State('new-url-link', 'value')
)
def update_url_list(n_clicks, new_name, new_link):
    ctx = dash.callback_context
    if ctx.triggered_id == 'add-url-button' and new_name and new_link:
        conn = get_db_connection()
        c = conn.cursor()
        new_id = str(uuid.uuid4())
        c.execute("INSERT INTO links VALUES (?, ?, ?)", (new_id, new_name, new_link))
        conn.commit()
        conn.close()
    
    links = get_links()
    return [
        dbc.ListGroupItem([
            dbc.Button(
                link['name'], 
                id={'type': 'url-button', 'index': link['id']},
                color="link",
                className="text-left"
            ),
            html.Span(
                "✕",
                id={'type': 'delete-button', 'index': link['id']},
                className="float-right text-danger",
                style={"cursor": "pointer"}
            )
        ], className="d-flex justify-content-between align-items-center")
        for link in links
    ]

@callback(
    Output('content-iframe', 'src'),
    Input({'type': 'url-button', 'index': dash.ALL}, 'n_clicks')
)
def update_iframe(n_clicks):
    ctx = dash.callback_context
    if not ctx.triggered:
        return dash.no_update
    button_id = ctx.triggered[0]['prop_id'].split('.')[0]
    clicked_id = eval(button_id)['index']
    conn = get_db_connection()
    c = conn.cursor()
    c.execute("SELECT url FROM links WHERE id = ?", (clicked_id,))
    result = c.fetchone()
    conn.close()
    if result:
        return result['url']
    return dash.no_update

@callback(
    Output('url-list', 'children', allow_duplicate=True),
    Input({'type': 'delete-button', 'index': dash.ALL}, 'n_clicks'),
    prevent_initial_call=True
)
def delete_url(n_clicks):
    ctx = dash.callback_context
    if not ctx.triggered:
        return dash.no_update
    button_id = ctx.triggered[0]['prop_id'].split('.')[0]
    delete_id = eval(button_id)['index']
    conn = get_db_connection()
    c = conn.cursor()
    c.execute("DELETE FROM links WHERE id = ?", (delete_id,))
    conn.commit()
    conn.close()
    return update_url_list(None, None, None)

if __name__ == '__main__':
    print("Starting the Dash application...")
    app.run(debug=True, host='0.0.0.0', port=7860)
    print("Dash application has finished running.")