File size: 4,365 Bytes
6ca8ec7
 
 
 
 
 
 
 
 
6fe716c
6ca8ec7
6fe716c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6ca8ec7
 
 
6fe716c
 
6ca8ec7
6fe716c
 
 
6ca8ec7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6fe716c
 
6ca8ec7
 
 
6fe716c
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
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])

# Initialize SQLite database
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()
    
    # Initialize with some example URLs if the table is empty
    c.execute("SELECT COUNT(*) FROM links")
    if c.fetchone()[0] == 0:
        initial_urls = [
            {"id": str(uuid.uuid4()), "name": "Google", "url": "https://www.google.com"},
            {"id": str(uuid.uuid4()), "name": "Bing", "url": "https://www.bing.com"},
        ]
        c.executemany("INSERT INTO links VALUES (:id, :name, :url)", initial_urls)
        conn.commit()
    conn.close()

init_db()

# Function to get all links from the database
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.Row([
        # Left navigation column
        dbc.Col([
            html.H2("My URL App", className="mt-3 mb-4"),
            html.Div(id='url-list'),
            dbc.Input(id='new-url-name', placeholder="New URL Name", className="mb-2"),
            dbc.Input(id='new-url-link', placeholder="New URL", className="mb-2"),
            dbc.Button("Add URL", id='add-url-button', color="primary", className="mb-3"),
        ], width=3, className="bg-light p-3"),
        
        # Main content column with iframe
        dbc.Col([
            html.Iframe(id='content-iframe', style={'width': '100%', 'height': '800px'})
        ], width=9)
    ])
], fluid=True)

@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.Button(
            link['name'], 
            id={'type': 'url-button', 'index': link['id']},
            color="link",
            className="d-block text-left mb-2"
        ) for link in links
    ] + [
        dbc.Button(
            "Delete",
            id={'type': 'delete-button', 'index': link['id']},
            color="danger",
            size="sm",
            className="mr-2 mb-2"
        ) 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.")